31

Tôi có thể tạo truy vấn phụ SQL trong Ràng buộc kiểm tra không?Truy vấn phụ SQL trong ràng buộc kiểm tra

Tôi đã một bảng post với các cột id, owner
Tôi đã một bảng action với các cột user_id, post_id
Bảng user với các cột id

post_id -> post.iduser_id -> user.id cũng post.owner -> user.id

Bây giờ tôi muốn hạn chế post(post_id).id != user_id trên bảng action

Làm cách nào có thể?

+0

Tại sao nó nên quan trọng nếu một cột tham chiếu đến một bảng sẽ xảy ra để có một giá trị * * đó là hiện diện trong bảng khác? Bạn đang cố giải quyết vấn đề gì? – SingleNegationElimination

Trả lời

51

Nó không được hỗ trợ để nhìn xa hơn hàng hiện tại trong ràng buộc CHECK.

http://www.postgresql.org/docs/9.1/interactive/sql-createtable.html nói:

Một hạn chế kiểm tra quy định như một cột hạn chế nên tham khảo chỉ giá trị của cột đó, trong khi một biểu hiện xuất hiện trong một hạn chế bảng có thể tham khảo nhiều cột.

Hiện tại, biểu thức CHECK không thể chứa truy vấn con cũng không tham chiếu đến các biến số ngoài các cột của hàng hiện tại.

Có lý do chính đáng cho việc hạn chế này, nhưng nếu bạn muốn sắp xếp các ngọn đuốc rực trong khi đi xe đạp một bánh xe qua lưu lượng lớn, bạn có thể hủy bỏ hạn chế sử dụng các chức năng. Các tình huống trong đó điều này sẽ không trở lại để cắn bạn hiếm; bạn sẽ an toàn hơn nhiều khi thực thi bất biến trong mã kích hoạt thay thế.

http://www.postgresql.org/docs/9.1/interactive/triggers.html

+19

+1 cho "sắp xếp ngọn đuốc rực trong khi cưỡi một bánh xe đạp qua lưu lượng lớn" :-) –

+4

Mỗi [Nhận xét của Tom Lane] (http://www.postgresql.org/message-id/[email protected]), hacking xung quanh subquery hạn chế không được thông báo: _ "KIỂM TRA có nghĩa là để xử lý các ràng buộc trên một giá trị của hàng ** trong sự cô lập ** .Nếu bạn cố gắng sử dụng nó để thực thi cross-row điều kiện, dự án chắc chắn sẽ kết thúc nặng. _ – Shane

+2

Vâng, điều này là đúng: "KIỂM TRA có nghĩa là để xử lý các ràng buộc trên giá trị của một hàng trong sự cô lập." ... Nhưng: một ràng buộc duy nhất là gì? Có phải là "sắp xếp ngọn đuốc rực trong khi cưỡi một bánh xe đạp qua lưu lượng lớn"? BTW Tôi đã thử chạy cả hai ngọn đuốc lửa và cưỡi một bánh xe đạp. Cho đến giờ tôi không thể làm cả hai, nhưng có lẽ trong tương lai – guettli