唯一约束/引用 postgres 中另一个表的列

问题描述

我有两张桌子。在 table_b 中,我想从 table_a 中引用两列(不是主键)(因为当我加入这两个表时,我想同时加入 product_idgroup_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_idgroup_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 通常是一种设计味道。