簡體   English   中英

在多個表中排除約束?

[英]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_idtodos是不是一種選擇,因為這只是一個小例子,而在現實生活中的應用程序,我有更多的0..N連接。

您可以編寫一個AFTER INSERT OR UPDATE觸發器來檢查條件,如果不滿足則拋出錯誤。

但是請注意,此類觸發器具有爭用條件-兩次並發數據修改不能看到彼此的影響。 因此,您要么必須使用SERIALIZABLE隔離級別,要么使用SELECT ... FOR UPDATE鎖定觸發器中受影響的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM