2015-08-12 4 views

ответ

3

ALTER В колонке от BIGINTEGER до BIGSERIAL, чтобы сделать ее автоматической инкрементальной t не будет работать. BIGSERIAL is not a true type, it is a trick that automates PK and SEQUENCE creation.

Вместо этого вы можете создать последовательность самостоятельно, а затем назначить его в качестве значения по умолчанию для столбца:

CREATE SEQUENCE "YOURSCHEMA"."SEQNAME"; 

ALTER TABLE "YOURSCHEMA"."TABLENAME" 
    ALTER COLUMN "COLUMNNAME" SET DEFAULT nextval('"YOURSCHEMA"."SEQNAME"'::regclass); 
ALTER TABLE "YOURSCHEMA"."TABLENAME" ADD CONSTRAINT pk PRIMARY KEY ("COLUMNNAME"); 
+2

Обратите внимание, что это будет * не * заполнять столбец существующими значениями. Таким образом, добавление ограничения «PRIMARY KEY» завершится неудачей, если существуют существующие строки, которые являются «NULL» или не уникальными. (Вы предполагаете, что пользователь еще не имеет первичного ключа. «SERIAL» предназначен не только для ПК, а «SERIAL» не подразумевает «SERIAL PRIMARY KEY»). Кроме того, если в таблице есть существующие строки, вам нужно «setval» последовательность, чтобы гарантировать, что она начинается с первого бесплатного идентификатора, «LOCK» вначале таблицы, чтобы предотвратить одновременную «INSERT's». –

12

Как объяснено в 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.

Смежные вопросы