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?
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
ALTER
ing 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");
Dies ist eine einfache Problemumgehung:
ALTER TABLE table_name drop column column_name, add column column_name bigserial;