PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL:serial a tożsamość

serial to „stara” implementacja automatycznie generowanych unikalnych wartości, która od wieków była częścią Postgresa. Nie jest to jednak część standardu SQL.

Aby być bardziej zgodnym ze standardem SQL, Postgres 10 wprowadził składnię używającą generated as identity .

Podstawowa implementacja nadal opiera się na sekwencji, definicja jest teraz zgodna ze standardem SQL. Jedną z rzeczy, na którą pozwala ta nowa składnia, jest zapobieganie przypadkowemu nadpisaniu wartości.

Rozważ następujące tabele:

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

Teraz, gdy biegasz:

insert into t1 (id) values (1);

Podstawowa sekwencja i wartości w tabeli nie są już zsynchronizowane. Jeśli uruchomisz inny

insert into t1 default_values;

Otrzymasz błąd, ponieważ sekwencja nie została zaawansowana przy pierwszym wstawieniu, a teraz próbuje wstawić wartość 1 ponownie.

Jednak w przypadku drugiej tabeli

insert into t2 (id) values (1);

Wyniki w:

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

Możesz więc przypadkowo „zapomnieć” o użyciu sekwencji. Nadal możesz to wymusić, używając override system value opcja:

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

co nadal pozostawia ci sekwencję niezsynchronizowaną z wartościami w tabeli, ale przynajmniej zostałeś o tym świadomy.

Zaleca się używanie nowej składni tożsamości zamiast serialu




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql :Jak wybrać pierwsze n procent (%) wpisów z każdej grupy/kategorii?

  2. Jak przekazać hasło do pg_dump?

  3. Entity Framework 6 z Npgsql

  4. Jak uzyskać aktualny czas w PostgreSQL

  5. Wyjaśnij bardziej szczegółowo sugestię dotyczącą wydajności warunku JOIN vs. LEFT JOIN i WHERE