跨多个表的列的 SQL 唯一约束

Posted

技术标签:

【中文标题】跨多个表的列的 SQL 唯一约束【英文标题】:SQL Unique Constraint with columns spanning multiple tables 【发布时间】:2021-12-13 10:39:18 【问题描述】:

我有一个场景,我需要使用来自 2 个不同表的列添加唯一约束。 我有 2 张桌子。第一个表是这样的,

TABLE MODEL(
    ID PRIMARY_KEY,
    KEY
)

第二个表为,

TABLE OWNERS(
    ID PRIMARY_KEY,
    MODEL_ID FOREIGN_KEY REFERENCES MODEL.ID,
    USER
)

我的要求是MODEL.KEY + OWNERS.USER 的组合应该是唯一的。 我们怎样才能做到这一点?

注意: 我使用 Postgres 作为数据库。 无法将 OWNERS.USER 添加到 MODEL 表中。

【问题讨论】:

“MODEL.KEY + OWNERS.USER 的组合应该是唯一的”是什么意思?在什么表/行集合中?模型交叉加入所有者?所有者的模型交叉连接投影的投影? (相同。)请通过编辑而不是 cmets 进行澄清。 How to Ask minimal reproducible example PS 使用 SQL 声明性约束,您可以将其作为基表并声明适当的 UNIQUE 和 FK 约束。当然,更新必须是适当的。 PS SQL 中的通用约束实施需要触发器。 PS你的研究表明了什么? PS您对架构更改给出了一些限制,但最终允许的shema更改是什么? 【参考方案1】:

您的数据模型无法做到这一点。您必须有一个额外的表 owner_key 或这样才能保存 key(作为主键)并被其他两个表引用。

避免为列或表使用类似user 的名称,因为这是保留的 SQL 关键字。

【讨论】:

嗨 @Laurenz,我需要 MODEL.KEY + OWNERS.USER 的唯一性。假设我在模型表中有 2 个条目,其中包含一个键“销售”。使用您所说的方法,单个用户可以有重复的条目,因为 id 对于相同的键条目是唯一的。 我明白了。我已经修改了我的答案。

以上是关于跨多个表的列的 SQL 唯一约束的主要内容,如果未能解决你的问题,请参考以下文章

mysql唯一约束

sqlserver表的唯一键约束怎么设置?

为sql中的列设置唯一约束

SQL中Unique约束有啥用啊?

基础篇 - SQL 的约束

SQL NOT NULL 约束