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

Cập nhật trình tự trên hàng INSERT

Đó là một hạn chế đã biết:các chuỗi được tăng lên trong quá trình gọi nextval () , là giá trị mặc định của trường. Khi bạn cung cấp dữ liệu tại INSERT đối với trường đó, biểu thức của giá trị mặc định không đánh giá, đó là lý do tại sao giá trị của trình tự không được chạm vào.

Cách giải quyết là thiết lập trình kích hoạt trước / sau INSERT để sửa chữa thủ công giá trị của trình tự bằng setval () . Nhưng theo cách này, bạn nên cần thiết lập trình kích hoạt vào UPDATE trên trường đó, để sửa giá trị của trình tự, khi bạn chỉ cần cập nhật một số id hiện có lên một id cao hơn.

Một giải pháp khác là bạn viết một hàm được lưu trữ, hàm này có thể tạo ra một giá trị có sẵn cho trường đó và đặt giá trị mặc định cho trường của bạn thành giá trị trả về của hàm đó. Vài nét, như:

LOOP
    result = nextval('my_id_seq');
    EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;

Nhưng được cảnh báo:chức năng mặc định cho các chuỗi là an toàn cho các lần chèn đồng thời (trạng thái hiện tại của chuỗi là toàn cầu - độc lập với giao dịch). Nếu bạn cung cấp các giá trị rõ ràng cho các trường đó, điều đó sẽ không xảy ra.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể tìm thấy cột có tên logic

  2. đa hình cho các ràng buộc NGOẠI KHÓA

  3. Sắp xếp các giá trị rỗng sau tất cả các giá trị khác, ngoại trừ giá trị đặc biệt

  4. Một-nhiều-một với các thuộc tính Biểu mẫu với Symfony 3 / Doctrine

  5. Chuyển từ DB2 sang PostgreSQL - Điều bạn nên biết