2015-08-12 17 views
10

Wenn ich versuche, den Datentyp der Spalte in einer Tabelle mit altem Befehl zu ändern ...PostgreSQL Spalte Typumwandlung Form Bigint BIGSERIAL

alter table temp alter column id type bigserial; 

Ich

ERROR: type "bigserial" does not exist 

bekommen, wie bin es ist für mich möglich, den Datentyp von bigint in bigserial

Antwort

3

ALTER in eine Spalte von BIGINTEGER zu BIGSERIAL zu ändern, um es automatisch inkremen t wird nicht funktionieren. BIGSERIAL is not a true type, it is a trick that automates PK and SEQUENCE creation.

Stattdessen können Sie eine Sequenz selbst erstellen, weisen Sie es als Standard für eine Spalte:

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"); 
+2

Beachten Sie, dass die * Spalte * die Spalte nicht mit vorhandenen Werten füllt. Das Hinzufügen der PRIMARY KEY-Einschränkung wird daher fehlschlagen, wenn Zeilen vorhanden sind, die "NULL" oder nicht eindeutig sind. (Sie gehen davon aus, dass der Benutzer noch keinen Primärschlüssel hat. 'SERIAL' ist nicht nur für eine PK, und' SERIAL' bedeutet nicht 'SERIAL PRIMARY KEY'). Wenn die Tabelle über vorhandene Zeilen verfügt, müssen Sie außerdem die Sequenz "setval" setzen, um sicherzustellen, dass sie bei der ersten freien Kennung beginnt, wobei die Tabelle zuerst gesperrt wird, um gleichzeitige INSERT-Operationen zu verhindern. –

12

Wie in den documentation, SERIAL ist kein Datentyp, sondern eine Abkürzung für eine Sammlung von anderen Befehlen .

So, während Sie es nicht ändern können einfach durch die Art zu verändern, können Sie den gleichen Effekt erzielen, indem sie diese anderen laufenden Befehle selbst:

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; 

die Besitzer Eine Änderung wird sichergestellt, dass die Sequenz, wenn die entfernt wird Tabelle/Spalte wird gelöscht. Es gibt Ihnen auch das erwartete Verhalten in der pg_get_serial_sequence() Funktion.

Die Einhaltung der tablename_columnname_seq Namenskonvention ist notwendig, 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 anzeigen, auch wenn die Spalte ursprünglich als SERIAL-Typ deklariert wurde.