带外键的唯一约束
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 应该是候选键的一部分。
我有两个具有以下列的 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 应该是候选键的一部分。