sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL:sériové vs identita

serial je "stará" implementace automaticky generovaných jedinečných hodnot, která je součástí Postgresu po věky. To však není součástí standardu SQL.

Aby byl Postgres 10 více v souladu se standardem SQL, zavedl syntaxi pomocí generated as identity .

Základní implementace je stále založena na sekvenci, definice nyní odpovídá standardu SQL. Jedna věc, kterou tato nová syntaxe umožňuje, je zabránit náhodnému přepsání hodnoty.

Zvažte následující tabulky:

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

Nyní, když spustíte:

insert into t1 (id) values (1);

Základní sekvence a hodnoty v tabulce již nejsou synchronizované. Pokud spustíte další

insert into t1 default_values;

Dostanete chybu, protože sekvence nebyla posunuta prvním vložením a nyní se pokouší vložit hodnotu 1 znovu.

S druhou tabulkou však

insert into t2 (id) values (1);

Výsledky v:

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

Takže můžete omylem "zapomenout" na použití sekvence. Stále to můžete vynutit pomocí override system value možnost:

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

což vám stále ponechává sekvenci, která není synchronizována s hodnotami v tabulce, ale alespoň jste na to byli upozorněni.

Doporučuje se používat novou syntaxi identity spíše než sériové




  1. Jak vytvořit databázi v SQL?

  2. Co dělá návrhář databází?

  3. Jak změnit prioritu pro souběžný program

  4. Průvodce návrhem databáze pro Správce úloh v MySQL