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?
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
ALTER
ing 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");
Ceci est une solution de contournement simple:
ALTER TABLE table_name drop column column_name, add column column_name bigserial;