web-dev-qa-db-fra.com

Formulaire de conversion de type de colonne PostgreSQL de bigint à bigserial

Lorsque j'essaie de changer le type de données d'une colonne dans une table en modifiant la commande ...

alter table temp alter column id type bigserial;

Je reçois

ERROR:  type "bigserial" does not exist

Comment changer le type de données de bigint à bigserial?

14
k s l kumar

Comme expliqué dans la documentation , SERIAL n'est pas un type de données, mais un raccourci pour une collection d'autres commandes.

Ainsi, bien que vous ne puissiez pas le changer simplement en modifiant le type, vous pouvez obtenir le même effet en exécutant vous-même ces autres commandes:

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;

La modification du propriétaire garantira que la séquence est supprimée si la table/colonne est supprimée. Cela vous donnera également le comportement attendu dans la fonction pg_get_serial_sequence () .

Il est nécessaire de s’en tenir à la convention de nommage tablename_columnname_seq pour convaincre certains outils tels que pgAdmin de signaler ce type de colonne à BIGSERIAL. Notez que psql et pg_dump afficheront toujours la définition sous-jacente, même si la colonne a été initialement déclarée en tant que type SERIAL.

A partir de Postgres 10, vous avez également la possibilité d'utiliser un standard SQL identity column , qui gère tout cela de manière invisible, et que vous pouvez facilement ajouter à une table existante:

ALTER TABLE temp ALTER COLUMN id
  ADD GENERATED BY DEFAULT AS IDENTITY
20
Nick Barnes

ALTERing une colonne de BIGINTEGER à BIGSERIAL afin de l'incrémenter automatiquement ne fonctionnera pas. BIGSERIAL N'EST PAS UN TYPE RÉEL, C'EST UNE ASTUCE QUI AUTOMATISE LA CRÉATION DE PK ET SEQUENCE .

Au lieu de cela, vous pouvez créer vous-même une séquence, puis l'affecter comme valeur par défaut pour une colonne:

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");
6
Vao Tsun

Ceci est une solution de contournement simple:

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