Преобразование типа столбца PostgreSQL формы bigint в bigserial

Когда я пытаюсь изменить тип данных столбца в таблице с помощью команды alter...

alter table temp alter column id type bigserial;

я получил

ERROR:  type "bigserial" does not exist

Как я могу изменить тип данных с bigint на bigserial?

Ответ 1

Как объясняется в документации, 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.

Начиная с Postgres 10, у вас также есть возможность использовать стандартный столбец идентификаторов SQL, который обрабатывает все это незаметно и который можно легко добавить в существующую таблицу:

ALTER TABLE temp ALTER COLUMN id
  ADD GENERATED BY DEFAULT AS IDENTITY

Ответ 2

ALTER ИНГ столбец из BIGINTEGER в BIGSERIAL для того, чтобы сделать его автоинкрементным не будет работать. BIGSERIAL - это не настоящий тип, это трюк, который автоматизирует создание PK и SEQUENCE.

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

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");

Ответ 3

Это простой обходной путь:

ALTER TABLE table_name drop column column_name, add column column_name bigserial;

Ответ 4

Postgres for SERIAL создает столбец с типом int и соответствующей последовательностью и устанавливает значение по умолчанию из последовательности в этот столбец. Вам просто нужно обновить тип столбца:

alter table temp alter column id type BIGINT;

и он будет работать как BIGSERIAL.