[英]Exclude constraint across many tables?
請考慮下表:
todos:
id | floor_start | floor_end
----+-------------+-------------
1 | 10 | 20
2 | 20 | 30
3 | 30 | 40
4 | 35 | 45
為了防止同一層有2部電梯,我可以選擇:
EXCLUDE USING gist(int4range(start,end) with &&)
在這種情況下,3將與4沖突。
但是我有一個聯接表:
occupations:
todo_id | room_id
---------+----------
3 | 1
4 | 2
因此(3)在room_id = 1
完成,而(4)在room_id = 2
,它們不會沖突。
1和2在聯接表中沒有條目,因此所有房間都被占用。
我了解到exclude
僅在當前表格的范圍內有效-我該如何處理呢? 我應該制作多余的列嗎?
添加room_id
到todos
是不是一種選擇,因為這只是一個小例子,而在現實生活中的應用程序,我有更多的0..N連接。
您可以編寫一個AFTER INSERT OR UPDATE
觸發器來檢查條件,如果不滿足則拋出錯誤。
但是請注意,此類觸發器具有爭用條件-兩次並發數據修改不能看到彼此的影響。 因此,您要么必須使用SERIALIZABLE
隔離級別,要么使用SELECT ... FOR UPDATE
鎖定觸發器中受影響的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.