PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL:nối tiếp và danh tính

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ác
insert 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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. So sánh các công cụ cân bằng tải cho PostgreSQL

  2. Làm thế nào để tìm kiếm một giá trị cụ thể trong tất cả các bảng (PostgreSQL)?

  3. Sao chép một vài cột của tệp csv vào bảng

  4. Làm thế nào để loại bỏ cơ sở dữ liệu PostgreSQL nếu có các kết nối đang hoạt động với nó?

  5. Không có hàm nào phù hợp với các loại đối số và tên đã cho