两个外键的唯一约束始终是不同的组合

Posted

技术标签:

【中文标题】两个外键的唯一约束始终是不同的组合【英文标题】:Unique constraint on two foreign keys to always be a different combination 【发布时间】:2018-05-07 09:47:02 【问题描述】:

我有一个名为 Followers 的表,其中包含一个 PK 列和两个 FK 列,它们将存储名为 User 的表的整数。但是我不想在列中复制值 - 两个 FK 的组合需要始终不同。我该怎么做?

【问题讨论】:

Add unique constraint to combination of two columns的可能重复 没有 DDL 和对您的要求的清晰描述,只能猜测。您是否认为值集 (1, 2) 不同于 (2, 1) - 忽略您的身份主键列? 【参考方案1】:

为两列创建一个唯一键

【讨论】:

【参考方案2】:

独特的index 或constraint 将解决您的问题。唯一约束在幕后实现为唯一索引,因此您对任一解决方案的选择都是微不足道的。

为了演示,让我们假设以下人为场景。

create table User (
  Id int identity primary key,
  name varchar(255) not null
);
go

create table Follower (
  Id int identity primary key,
  UserId int foreign key references User(Id),
  FollowerId int foreign key references User(Id)
);
go

为确保UserId & FollowerId 的唯一性,添加以下唯一索引。

create unique index ux_follower_userid_followerid
  on Follower
  (
    UsrId
    ,FollowerId
  );
go

请注意,通常建议在外键列上也包含非聚集索引以促进连接。

【讨论】:

以上是关于两个外键的唯一约束始终是不同的组合的主要内容,如果未能解决你的问题,请参考以下文章

主键约束,外键约束,空值约束,默认值约束,唯一约束,检查约束的各个作用是啥?

数据库外键约束?

主键、外键和索引的区别?

如何在MySQL中设置外键约束以及外键的作用

数据库主键外键

SQL FOREIGN KEY 约束:外键的用法大全