Vấn đề thú vị. Đây là dự đoán tốt nhất của tôi. Tôi chưa thử nghiệm nào trong số đó.
Nói chung, sự phỏng đoán có học thức của postgres về các câu lệnh sẽ có tác động gì đến dữ liệu không mở rộng thành logic kích hoạt. Khi thực hiện câu lệnh thứ hai, postgres nhìn thấy ràng buộc khóa ngoại và biết rằng nó phải kiểm tra xem giá trị đang được gán (được chèn) có hợp lệ hay không, nghĩa là nếu nó đại diện cho một khóa hợp lệ trong bảng ngoại. Tuy nhiên, có thể là một phương pháp xấu, trình kích hoạt có thể ảnh hưởng đến tính hợp lệ của khóa ngoại đang được đề xuất (ví dụ:nếu trình kích hoạt xóa các bản ghi).
(trường hợp 1) Nếu không có trình kích hoạt, thì nó có thể xem xét dữ liệu (cả cam kết trước và giai đoạn cho cam kết) và quyết định xem giá trị được đề xuất có hợp lệ hay không. (trường hợp 2) Nếu không có ràng buộc FK, thì trình kích hoạt không thể tác động đến tính hợp lệ của việc chèn, vì vậy nó được phép. (trường hợp 3) Nếu bạn bỏ qua detail_id=null
, không có thay đổi nào trong bản cập nhật nên trình kích hoạt sẽ không kích hoạt, vì vậy sự hiện diện của nó là không liên quan.
Tôi cố gắng tránh cả những ràng buộc và kích hoạt FK bất cứ khi nào có thể. Theo tôi, tốt hơn hết là để cơ sở dữ liệu vô tình chứa một phần dữ liệu không chính xác sau đó để nó bị treo hoàn toàn, giống như bạn đang thấy ở đây. Tôi sẽ loại bỏ tất cả các ràng buộc và trình kích hoạt FK, đồng thời buộc tất cả các hoạt động cập nhật và chèn hoạt động thông qua các chức năng được lưu trữ, thực hiện xác thực bên trong khóa bắt đầu / cam kết và xử lý các nỗ lực chèn / cập nhật không chính xác / không hợp lệ một cách thích hợp và ngay lập tức, thay vì buộc các postgres phải đợi lệnh 1 thực hiện trước khi quyết định xem lệnh 2 có được phép hay không.
Chỉnh sửa: xem câu hỏi này
Chỉnh sửa 2: Điều gần nhất mà tôi có thể tìm thấy trong tài liệu chính thức về thời gian của trình kích hoạt liên quan đến việc kiểm tra các ràng buộc là điều này từ tài liệu về trình kích hoạt
Điều này hơi không rõ ràng, nếu trình kích hoạt xảy ra trước khi kiểm tra ràng buộc áp dụng cho kiểm tra ràng buộc của các giao dịch khác. Dù là gì đi nữa, vấn đề này là một lỗi hoặc được ghi chép kém.