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

Có thể bắt lỗi vi phạm khóa ngoại trong postgres không

Nếu bạn chỉ chèn một hàng tại một thời điểm, bạn có thể tạo điểm lưu trước chèn và khôi phục vào nó khi chèn không thành công (hoặc giải phóng nó khi chèn thành công).

Đối với Postgres 9.5 trở lên, bạn có thể sử dụng INSERT ... ON CONFLICT DO NOTHING nó làm những gì nó nói. Bạn có thể cũng có thể ghi ON CONFLICT DO UPDATE SET column = value... , sẽ tự động chuyển đổi phụ trang của bạn thành bản cập nhật của hàng mà bạn đang xung đột (chức năng này đôi khi được gọi là "nâng cấp").

Điều này không hoạt động vì OP đang xử lý một khóa ngoài hạn chế chứ không phải là duy nhất hạn chế. Trong trường hợp đó, bạn có thể dễ dàng sử dụng phương pháp savepoint mà tôi đã mô tả trước đó, nhưng đối với nhiều hàng, nó có thể tẻ nhạt. Nếu bạn cần chèn nhiều hàng cùng một lúc, bạn nên tách chúng thành nhiều câu lệnh chèn, được cung cấp bạn không làm việc ở chế độ tự động gửi , tất cả các lần chèn diễn ra trong một giao dịch và bạn không chèn một số lượng hàng quá lớn.

Đôi khi, bạn thực sự cần nhiều lần chèn trong một câu lệnh duy nhất, bởi vì chi phí cho việc trao đổi với cơ sở dữ liệu của bạn cộng với chi phí để có các điểm lưu trên mỗi lần chèn đơn giản là quá cao. Trong trường hợp này, có một số cách tiếp cận không hoàn hảo. Có lẽ là ít tệ nhất là xây dựng một truy vấn lồng nhau chọn dữ liệu của bạn và kết hợp nó với bảng khác, giống như sau:

INSERT INTO table_A (column_A, column_B, column_C)
SELECT A_rows.*
FROM VALUES (...) AS A_rows(column_A, column_B, column_C)
JOIN table_B ON A_rows.column_B = table_B.column_B;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mở rộng hàng qua * không được hỗ trợ ở đây

  2. Ràng buộc duy nhất trên nhiều cột

  3. postgresql - lấy danh sách chênh lệch cột giữa 2 bảng

  4. cách nhóm theo và trả về hàng tổng trong Postgres

  5. Postgres db design Bình thường hóa bảng hoặc sử dụng cột mảng