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

sê-ri trong postgres đang được tăng lên mặc dù tôi đã thêm vào cuộc xung đột không làm gì cả

Lý do điều này khiến bạn cảm thấy kỳ lạ là bạn đang nghĩ về số gia tăng trên bộ đếm như một phần của thao tác chèn, và do đó, "DO NOTHING" phải có nghĩa là "không tăng bất cứ điều gì". Bạn đang hình dung thế này:

  1. Kiểm tra các giá trị cần chèn để chống lại sự ràng buộc
  2. Nếu phát hiện trùng lặp, hãy hủy bỏ
  3. Trình tự tăng dần
  4. Chèn dữ liệu

Nhưng trên thực tế, sự gia tăng phải xảy ra trước khi thử chèn . Một SERIAL cột trong Postgres được triển khai dưới dạng DEFAULT thực thi nextval() chức năng trên một SEQUENCE được ràng buộc . Trước khi DBMS có thể làm bất cứ điều gì với dữ liệu, nó phải có một tập hợp các cột hoàn chỉnh, vì vậy thứ tự của các hoạt động như sau:

  1. Giải quyết các giá trị mặc định, bao gồm cả việc tăng trình tự
  2. Kiểm tra các giá trị cần chèn để chống lại sự ràng buộc
  3. Nếu phát hiện trùng lặp, hãy hủy bỏ
  4. Chèn dữ liệu

Điều này có thể được nhìn thấy một cách trực quan nếu khóa trùng lặp nằm trong chính trường autoincrement:

CREATE TABLE foo ( id SERIAL NOT NULL PRIMARY KEY, bar text );
-- Insert row 1
INSERT INTO foo ( bar ) VALUES ( 'test' );
-- Reset the sequence
SELECT setval(pg_get_serial_sequence('foo', 'id'), 0, true);
-- Attempt to insert row 1 again
INSERT INTO foo ( bar ) VALUES ( 'test 2' )
     ON CONFLICT (id) DO NOTHING;

Rõ ràng, điều này không thể biết nếu có xung đột nếu không tăng trình tự, vì vậy "không làm gì" phải đến sau gia số đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ngày hội nhà phát triển PostgreSQL ở Praha 2016

  2. Tên quy trình PostgreSQL trên Solaris

  3. Cách đặt Định dạng đầu ra khoảng thời gian trong PostgreSQL

  4. Công bố Barman 1.0, Trình quản lý sao lưu và phục hồi cho PostgreSQL

  5. Cách tạm dừng việc thực thi một câu lệnh trong PostgreSQL