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 laininsert 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