PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL:seriell vs. Identität

serial ist die "alte" Implementierung von automatisch generierten eindeutigen Werten, die seit Ewigkeiten Teil von Postgres ist. Dies ist jedoch nicht Teil des SQL-Standards.

Um mit dem SQL-Standard besser kompatibel zu sein, hat Postgres 10 die Syntax mit generated as identity eingeführt .

Die zugrunde liegende Implementierung basiert weiterhin auf einer Sequenz, die Definition entspricht nun dem SQL-Standard. Eine Sache, die diese neue Syntax ermöglicht, ist, ein versehentliches Überschreiben des Werts zu verhindern.

Betrachten Sie die folgenden Tabellen:

create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);

Wenn Sie jetzt laufen:

insert into t1 (id) values (1);

Die zugrunde liegende Sequenz und die Werte in der Tabelle sind nicht mehr synchron. Wenn Sie eine andere

insert into t1 default_values;

Sie erhalten eine Fehlermeldung, da die Sequenz beim ersten Einfügen nicht weitergeschaltet wurde und nun versucht, den Wert 1 einzufügen wieder.

Bei der zweiten Tabelle hingegen

insert into t2 (id) values (1);

Ergebnisse in:

ERROR: cannot insert into column "id"
Detail: Column "id" is an identity column defined as GENERATED ALWAYS.

Sie können also versehentlich die Verwendung der Sequenz "vergessen". Sie können dies immer noch erzwingen, indem Sie den override system value verwenden Möglichkeit:

insert into t2 (id) overriding system value values (1);

was Sie immer noch mit einer Sequenz zurücklässt, die nicht mit den Werten in der Tabelle synchron ist, aber zumindest wurden Sie darauf aufmerksam gemacht.

Es wird empfohlen, die neue Identitätssyntax anstelle von serial

zu verwenden