在 postgres 中,我想将某个列中的值可能插入和更改为另一个表中的给定组合。
我有
table A
。 user_id
是唯一的,project_id
不是唯一的。
-- table A
default_project_id user_id place start ...
1 1 Berlin 01.01.2023 ...
1 2 Rome 01.01.2023 ...
2 3 Rio ... ...
3 4 ... ... ...
3 5 ... ... ...
然后是
table B
。 user_id
和 project_id
都不是唯一的。
-- table B
project_id user_id
1 1
2 1
3 1
2 2
5 3
4 4
9 4
1 ...
现在,我想向表
CONSTRAINT
添加一个 A
,它执行以下操作:
仅允许 default_project_id
用于 user_id
,表 project_id
中具有匹配的 user_id
和 B
组合。我认为对表 default_project_id
上的两列 user_id
和 A
引用表 project_id
上的 user_id
和 B
的外键约束可以做到这一点,但我得到了
没有与引用表 B 的给定键匹配的唯一约束
我该如何实现这个目标?
外键必须引用作为主键或形成唯一约束的列。这意味着引用的列总是有一个索引(主键或唯一约束的基础索引);因此检查引用行是否有匹配将是有效的。 (...)
所以你得到错误
There is no unique constraint matching given keys for references table table B
的原因是因为你在字段对unique constraint
,project_id
上没有user_id
。虽然它们在您的数据库中都不是唯一的,但我怀疑需要将同一项目分配给同一用户两次,因此这对(project_id
,user_id
)应该是唯一的。这可以通过添加UNIQUE CONSTRAINT来完成。
ALTER TABLE B
ADD CONSTRAINT user_in_project_unique UNIQUE (user_id, project_id);