带外键的唯一约束

问题描述

我有两个包含以下列的 Postgres 表:

命令

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

选项

类型
id 整数主键
名称 VARCHAR(32)
command_id COMMAND("id") 上的外键

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

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

解决方法

如果 Command 表中的 name 与 Option 列中的 name 列相同。那么选项表中的那一列是多余的,你总是可以通过你已经拥有的 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)
);

当然,命令表中的 name 和 id 应该是候选键的一部分。