Как объяснено в documentation, SERIAL
не тип данных, но ярлык для коллекции других команд ,
Таким образом, хотя вы не можете изменить его просто путем изменения типа, вы можете достичь того же эффекта, выполнив эти другие команды самостоятельно:
CREATE SEQUENCE temp_id_seq;
ALTER TABLE temp ALTER COLUMN id SET NOT NULL;
ALTER TABLE temp ALTER COLUMN id SET DEFAULT nextval('temp_id_seq');
ALTER SEQUENCE temp_id_seq OWNED BY temp.id;
Изменяя владелец будет гарантировать, что последовательность удаляется, если стол/столбец отбрасывается. Он также даст вам ожидаемое поведение в функции pg_get_serial_sequence().
Привязка к соглашению об именах tablename_columnname_seq
необходимо, чтобы убедить некоторые инструменты, такие как pgAdmin, сообщить об этом типе столбца как BIGSERIAL
. Обратите внимание, что psql и pg_dump всегда будут показывать базовое определение, даже если столбец был первоначально объявлен как тип SERIAL
.
Обратите внимание, что это будет * не * заполнять столбец существующими значениями. Таким образом, добавление ограничения «PRIMARY KEY» завершится неудачей, если существуют существующие строки, которые являются «NULL» или не уникальными. (Вы предполагаете, что пользователь еще не имеет первичного ключа. «SERIAL» предназначен не только для ПК, а «SERIAL» не подразумевает «SERIAL PRIMARY KEY»). Кроме того, если в таблице есть существующие строки, вам нужно «setval» последовательность, чтобы гарантировать, что она начинается с первого бесплатного идентификатора, «LOCK» вначале таблицы, чтобы предотвратить одновременную «INSERT's». –