两列上的外键约束,以将 ALTER 和 INSERT 限制为某些值

问题描述 投票:0回答:1

在 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 的给定键匹配的唯一约束

我该如何实现这个目标?

postgresql foreign-keys
1个回答
0
投票

根据DDL-CONSTRAINTS-FK

外键必须引用作为主键或形成唯一约束的列。这意味着引用的列总是有一个索引(主键或唯一约束的基础索引);因此检查引用行是否有匹配将是有效的。 (...)

所以你得到错误

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);
© www.soinside.com 2019 - 2024. All rights reserved.