Когда я пытаюсь изменить тип данных столбца в таблице с помощью команды alter...
alter table temp alter column id type bigserial;
я получил
ERROR: type "bigserial" does not exist
Как я могу изменить тип данных с bigint на bigserial?
Когда я пытаюсь изменить тип данных столбца в таблице с помощью команды alter...
alter table temp alter column id type bigserial;
я получил
ERROR: type "bigserial" does not exist
Как я могу изменить тип данных с bigint на bigserial?
Как объясняется в документации, 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
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");
Это простой обходной путь:
ALTER TABLE table_name drop column column_name, add column column_name bigserial;
Postgres for SERIAL
создает столбец с типом int
и соответствующей последовательностью и устанавливает значение по умолчанию из последовательности в этот столбец. Вам просто нужно обновить тип столбца:
alter table temp alter column id type BIGINT;
и он будет работать как BIGSERIAL.