PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL:serial vs identitas

serial adalah implementasi "lama" dari nilai unik yang dihasilkan secara otomatis yang telah menjadi bagian dari Postgres selama berabad-abad. Namun itu bukan bagian dari standar SQL.

Agar lebih sesuai dengan standar SQL, Postgres 10 memperkenalkan sintaks menggunakan generated as identity .

Implementasi yang mendasarinya masih berdasarkan urutan, definisi sekarang sesuai dengan standar SQL. Satu hal yang memungkinkan sintaks baru ini adalah untuk mencegah penggantian nilai yang tidak disengaja.

Perhatikan tabel berikut:

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

Sekarang ketika Anda menjalankan:

insert into t1 (id) values (1);

Urutan yang mendasari dan nilai dalam tabel tidak sinkron lagi. Jika Anda menjalankan

. yang lain
insert into t1 default_values;

Anda akan mendapatkan kesalahan karena urutannya tidak maju pada penyisipan pertama, dan sekarang mencoba memasukkan nilai 1 lagi.

Namun dengan tabel kedua,

insert into t2 (id) values (1);

Hasil dalam:

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

Jadi Anda dapat secara tidak sengaja "melupakan" penggunaan urutan. Anda masih dapat memaksa ini, menggunakan override system value pilihan:

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

yang masih meninggalkan Anda dengan urutan yang tidak sinkron dengan nilai-nilai dalam tabel, tetapi setidaknya Anda dibuat sadar akan hal itu.

Disarankan untuk menggunakan sintaks identitas baru daripada serial




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana justify_days() Bekerja di PostgreSQL

  2. POSTGRESQL Kunci Asing Merujuk Kunci Utama dari dua Tabel Berbeda

  3. PostgreSQL – Cara Menghilangkan Nilai Berulang

  4. PostgreSQL DATEADD() Setara

  5. Gabungkan dua tabel menjadi tabel baru sehingga memilih baris dari tabel lainnya diabaikan