带外键的唯一约束

Unique constraint with foreign key

我有两个具有以下列的 Postgres table:

命令

类型
id 整数主键
姓名 VARCHAR(32)

选项

类型
id 整数主键
姓名 VARCHAR(32)
command_id 命令上的外键(“id”)

我想在命令 name 列和选项 command_id 列绑定的位置添加另一个约束,这样两个命令可以共享相同的名称,前提是它们是不同选项的一部分。我将如何做出这样的约束?不添加约束,只允许后端在输入数据之前进行必要的检查会更好吗?

编辑:我意识到我对我的简单用例想得太多了,存储一个 JSON 字段就足够了。但是,如果 table 结构恰好更复杂,那么问题仍然有效。

如果命令 table 中的 name 与选项列中的 name 列相同。那么 Option table 中的那一列是多余的,你总是可以通过 FK 获取你已经拥有的名称 (command_id).

但通常您可以使用 composite key 作为 FK,例如:

 create table Options(
    id int primary key
    , name varchar(32)
    , command_id int
    , foreign key fk_name (name , command_id) references Command(name, id)
);

当然,命令 table 中的名称和 ID 应该是候选键的一部分。