sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL:seriel vs identitet

serial er den "gamle" implementering af auto-genererede unikke værdier, som har været en del af Postgres i evigheder. Det er dog ikke en del af SQL-standarden.

For at være mere kompatibel med SQL-standarden introducerede Postgres 10 syntaksen ved hjælp af generated as identity .

Den underliggende implementering er stadig baseret på en sekvens, definitionen er nu i overensstemmelse med SQL-standarden. En ting, som denne nye syntaks tillader, er at forhindre en utilsigtet tilsidesættelse af værdien.

Overvej følgende tabeller:

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

Nu når du kører:

insert into t1 (id) values (1);

Den underliggende sekvens og værdierne i tabellen er ikke længere synkroniserede. Hvis du kører en anden

insert into t1 default_values;

Du får en fejl, fordi sekvensen ikke blev avanceret af den første indsættelse, og nu forsøger at indsætte værdien 1 en gang til.

Med den anden tabel dog

insert into t2 (id) values (1);

Resultater i:

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

Så du kan ved et uheld "glemme" sekvensbrugen. Du kan stadig gennemtvinge dette ved at bruge override system value mulighed:

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

hvilket stadig efterlader dig med en sekvens, der er ude af sync med værdierne i tabellen, men i det mindste blev du gjort opmærksom på det.

Det anbefales at bruge den nye identitetssyntaks i stedet for seriel




  1. Databasebelastningsbalancering med ProxySQL &AWS Aurora

  2. Fjernelse af standardsporingen – Del 2

  3. Lær om MySQL Table Level Permissions

  4. Skal hver brugertabel have et grupperet indeks?