it-swarm.com.de

PostgreSQL-Spaltentypumwandlung von bigint nach bigserial

Wenn ich versuche, den Datentyp einer Spalte in einer Tabelle mit dem Befehl alter zu ändern.

alter table temp alter column id type bigserial;

Ich bekomme

ERROR:  type "bigserial" does not exist

Wie kann ich den Datentyp von bigint in bigserial ändern?

14
k s l kumar

Wie in der documentation erläutert, ist SERIAL kein Datentyp, sondern eine Abkürzung für eine Sammlung anderer Befehle.

Sie können den Befehl zwar nicht einfach durch Ändern des Typs ändern, Sie können jedoch auch diese anderen Befehle selbst ausführen:

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;

Durch Ändern des Eigentümers wird sichergestellt, dass die Sequenz entfernt wird, wenn die Tabelle/Spalte gelöscht wird. Sie erhalten auch das erwartete Verhalten in der Funktion pg_get_serial_sequence () .

Die Einhaltung der Namenskonvention tablename_columnname_seq ist erforderlich, um einige Tools wie pgAdmin davon zu überzeugen, diesen Spaltentyp als BIGSERIAL zu melden. Beachten Sie, dass psql und pg_dump immer die zugrunde liegende Definition zeigen, selbst wenn die Spalte ursprünglich als SERIAL-Typ deklariert wurde.

Ab Postgres 10 haben Sie außerdem die Möglichkeit, einen SQL-Standard Identitätsspalte zu verwenden, der all dies unsichtbar behandelt und den Sie leicht zu einer vorhandenen Tabelle hinzufügen können:

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

ALTERing eine Spalte von BIGINTEGER in BIGSERIAL, damit sie automatisch inkrementiert wird, funktioniert nicht. BIGSERIAL ist kein wahrer Typ, es ist ein Trick, der die Erzeugung von PK und SEQUENCE automatisiert .

Stattdessen können Sie eine Sequenz selbst erstellen und diese dann als Standard für eine Spalte festlegen:

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

Dies ist eine einfache Problemumgehung:

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