如何解决唯一约束/引用 postgres 中另一个表的列
我有两张桌子。在 table_b
中,我想从 table_a
中引用两列(不是主键)(因为当我加入这两个表时,我想同时加入 product_id
和 group_id
)。我还希望这两个键的组合是独一无二的。如果我在 table_b
上没有主键 ID,那么这个外键本质上是一个复合键吗?在 table_b
中创建这个外键对我来说有意义吗(即使它没有引用来自 table_a
的主键?
在 table_b
上设置如下两个约束是否有意义?
CREATE TABLE table_a(
id SERIAL PRIMARY KEY,product_id VARCHAR,// can be null
group_id VARCHAR NOT NULL,)
CREATE TABLE table_b(
id SERIAL PRIMARY KEY,product_id VARCHAR NOT NULL,group_id VARCHAR NOT NULL,CONSTRAINT fk_key FOREIGN KEY(product_id,group_id) REFERENCES table_a(product_id,group_id)
CONSTRAINT unique_id UNIQUE (product_id,group_id);
)
请注意,table_a
product_id
可以为空,但不能为 table_b
中的。 table_b 中来自 table_a 的所有引用仅在 product_id
和 group_id
不为空时才包含。谢谢!
解决方法
外键需要引用键,但不一定是主键。因此,您需要在 table_a
中包含唯一约束。
CREATE TABLE table_a
(id serial,product_id varchar,group_id varchar
NOT NULL,PRIMARY KEY (id),UNIQUE (product_id,group_id));
CREATE TABLE table_b
(id serial,product_id varchar
NOT NULL,FOREIGN KEY (product_id,group_id)
REFERENCES table_a
(product_id,group_id),group_id));
,
不要创建从 table_b 到 table_a 的 FK,因为 table_a 允许 product_id 为 null 实际上不存在这种关系。
就这样
create table table_a (
id serial primary key
product_id varchar,group_id varchar qnot null,unique (product_id,group_id)
foreign key (product_id,group_id)
references table_b (product_id,group_id)
)
看起来 table_b 应该折叠到 table_a 中,我建议您这样做; 2-way FK 通常是一种设计味道。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。