serial
là cách triển khai "cũ" của các giá trị duy nhất được tạo tự động đã là một phần của Postgres cho các lứa tuổi. Tuy nhiên đó không phải là một phần của tiêu chuẩn SQL.
Để tuân thủ nhiều hơn với tiêu chuẩn SQL, Postgres 10 đã giới thiệu cú pháp bằng cách sử dụng generated as identity
.
Việc triển khai cơ bản vẫn dựa trên một trình tự, định nghĩa hiện tuân theo tiêu chuẩn SQL. Một điều mà cú pháp mới này cho phép là ngăn chặn việc ghi đè giá trị một cách tình cờ.
Hãy xem xét các bảng sau:
create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);
Bây giờ khi bạn chạy:
insert into t1 (id) values (1);
Trình tự bên dưới và các giá trị trong bảng không đồng bộ nữa. Nếu bạn chạy
khácinsert into t1 default_values;
Bạn sẽ gặp lỗi vì trình tự không được nâng cao bởi lần chèn đầu tiên và bây giờ cố gắng chèn giá trị 1
lần nữa.
Tuy nhiên, với bảng thứ hai,
insert into t2 (id) values (1);
Kết quả trong:
ERROR: cannot insert into column "id" Detail: Column "id" is an identity column defined as GENERATED ALWAYS.
Vì vậy, bạn có thể vô tình "quên" sử dụng trình tự. Bạn vẫn có thể buộc điều này bằng cách sử dụng override system value
tùy chọn:
insert into t2 (id) overriding system value values (1);
điều này vẫn để lại cho bạn một chuỗi không đồng bộ với các giá trị trong bảng, nhưng ít nhất bạn đã biết về điều đó.
Bạn nên sử dụng cú pháp nhận dạng mới thay vì nối tiếp