Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 是否跨多个表排除约束?_Postgresql_Exclusion Constraint - Fatal编程技术网

Postgresql 是否跨多个表排除约束?

Postgresql 是否跨多个表排除约束?,postgresql,exclusion-constraint,Postgresql,Exclusion Constraint,考虑下表: todos: id | floor_start | floor_end ----+-------------+------------- 1 | 10 | 20 2 | 20 | 30 3 | 30 | 40 4 | 35 | 45 occupations: todo_id | room_id ---------+---------- 3 | 1 4 | 2

考虑下表:

todos:

 id | floor_start | floor_end
----+-------------+-------------
 1  | 10          | 20
 2  | 20          | 30
 3  | 30          | 40
 4  | 35          | 45
occupations:

 todo_id | room_id
---------+----------
 3       | 1
 4       | 2

为了防止同一楼层有两部电梯,我可以选择:

EXCLUDE USING gist(int4range(start,end) with &&)
在这种情况下,3将与4冲突

但是,我有一个连接表:

todos:

 id | floor_start | floor_end
----+-------------+-------------
 1  | 10          | 20
 2  | 20          | 30
 3  | 30          | 40
 4  | 35          | 45
occupations:

 todo_id | room_id
---------+----------
 3       | 1
 4       | 2

因此,(3)在
房间id=1
中完成,(4)在
房间id=2
中完成,它们不会冲突

1和2在联接表中没有条目,因此所有房间都已占用

我知道
exclude
仅在当前表的范围内有效-我如何处理它?我应该做多余的列吗


room\u id
添加到
todos
不是一个选项,因为这只是一个最小的示例,在现实生活中,我有更多的0..N连接。

您可以在插入或更新后编写
触发器,检查条件,如果不满足,则抛出错误


但是要注意,这样的触发器有一个竞争条件——两个并发的数据修改不能看到彼此的效果。因此,您要么使用
SERIALIZABLE
隔离级别,要么使用
SELECT锁定触发器中受影响的行。。。对于更新

,您可以在插入或更新后编写一个
触发器,检查条件,如果不满足,则抛出一个错误

但是要注意,这样的触发器有一个竞争条件——两个并发的数据修改不能看到彼此的效果。因此,您要么使用
SERIALIZABLE
隔离级别,要么使用
SELECT锁定触发器中受影响的行。。。用于更新