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.
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. –