【问题标题】:constraints that are unique / references columns of another table in postgres唯一的约束/引用postgres中另一个表的列
【发布时间】:2021-05-08 02:20:14
【问题描述】:

我有两张桌子。在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 中的不能为空。仅当 product_idgroup_id 不为空时,table_b 中的 table_a 的所有引用才会包括在内。谢谢!

【问题讨论】:

  • 我被这句话困住了:“我想引用两列(不是主键)。”我无法想象引用两个 text 列比一个漂亮、简单的整数主键更可取的场景。

标签: sql postgresql unique-constraint


【解决方案1】:

外键需要引用键,但不一定是键。因此,您需要在 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,
              group_id varchar
                       NOT NULL,
              PRIMARY KEY (id),
              FOREIGN KEY (product_id,
                           group_id)
                          REFERENCES table_a
                                     (product_id,
                                      group_id),
              UNIQUE (product_id,
                      group_id));

【讨论】:

  • varchar(1)varchar 不同。它也不太可能有用;最大长度为 1 的可变长度字符串不能包含许多不同的值。
  • @Bohemian:习惯。我发现varchars 没有长度混淆。还是改了。
【解决方案2】:

不要创建从 table_b 到 table_a 的 FK,因为实际上不存在这样的关系,因为 table_a 允许 product_id 为空。

就这样

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 通常是一种设计风格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2014-06-25
    • 2015-03-06
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多