postgresql 如何确保连接表引用具有复合FK的两个表,两个表中的一列是公共的?

8ehkhllq  于 2022-12-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(146)

我有三张table:employeeevent,这些是N-N,所以第三个表是employee_event
诀窍在于,它们只能在相同的group内N-N

employee
+---------+--------------+
| id      | group        |
+---------+--------------+
| 1       |        A     |
| 2       |        B     |
+---------+--------------+
event
+---------+--------------+
| id      | group        |
+---------+--------------+
| 43      |        A     |
| 44      |        B     |
+----
employee_event
+---------+--------------+
| employee_id | event_id     |
+-------------+--------------+
| 1           |       43     |
| 2           |       44     |
+---------+--------------+

因此,组合employee_id=1event_id=44应该是不可能的,因为来自组A的员工不能参加来自组B的事件。如何使用此组合来保护我的数据库?
我的第一个想法是添加列employee_event.group,这样我就可以将两个分别为employee_id + groupevent_id + group的FK(复合)添加到表employeeevent中。
谢谢!

rsaldnfx

rsaldnfx1#

您可以创建一个函数并将其用作表employee_event的检查约束。

create or replace function groups_match (employee_id integer, event_id integer)
returns boolean language sql as
$$
select 
 (select group from employee where id = employee_id) =
 (select group from event where id = event_id);
$$;

然后在表employee_event上添加check约束。

ALTER TABLE employee_event
ADD CONSTRAINT groups_match_check 
CHECK groups_match(employee_id, event_id);

仍然要记住,如果表employeeevent发生某些更改,employee_event中曾经有效的行可能会变为无效,但仍然保持不变。

相关问题