sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL:serial vs identidad

serial es la implementación "antigua" de valores únicos generados automáticamente que ha sido parte de Postgres durante mucho tiempo. Sin embargo, eso no es parte del estándar SQL.

Para ser más compatible con el estándar SQL, Postgres 10 introdujo la sintaxis usando generated as identity .

La implementación subyacente todavía se basa en una secuencia, la definición ahora cumple con el estándar SQL. Una cosa que permite esta nueva sintaxis es evitar una anulación accidental del valor.

Considere las siguientes tablas:

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

Ahora cuando ejecutas:

insert into t1 (id) values (1);

La secuencia subyacente y los valores de la tabla ya no están sincronizados. Si ejecuta otro

insert into t1 default_values;

Obtendrá un error porque la secuencia no avanzó en la primera inserción y ahora intenta insertar el valor 1 otra vez.

Sin embargo, con la segunda tabla,

insert into t2 (id) values (1);

Resultados en:

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

Entonces puede "olvidar" accidentalmente el uso de la secuencia. Todavía puede forzar esto, usando el override system value opción:

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

lo que aún lo deja con una secuencia que no está sincronizada con los valores de la tabla, pero al menos se le informó de eso.

Se recomienda utilizar la nueva sintaxis de identidad en lugar de serial