如何使表b的列仅对表a中的不同外键条目唯一

时间:2019-02-11 11:20:58

标签: sql sql-server sql-server-2014

假设有一个名为Emails的表

CREATE TABLE Emails (
    ID nvarchar(40) NOT NULL,
    Link_ID int NOT NULL,
        GROUP int NOT NULL,
    Email nvarchar(100) NOT NULL)

和一个名为Info的表

CREATE TABLE Info (
    CUST_ID int NOT NULL,
        Link_ID int NOT NULL)

这是表的简化视图,我无法更改它们的列。

我的目标是:

允许:

Cust_ID Group   Email
1       0   test1@allowed.com
1       1   test1@allowed.com

禁止:

Cust_ID Group   Email
1       0   test2@forbidden.com
1       0   test2@forbidden.com

Cust_ID Group   Email
1       0   test3@forbidden.com
2       1   test3@forbidden.com

Cust_ID Group   Email
1       0   test4@forbidden.com
2       0   test4@forbidden.com

如何在MSSQL 2014中实现这种独特性?

编辑: 我的目标是这样的:

  • 客户可以拥有多个电子邮件地址
  • 每个客户的电子邮件地址必须唯一,但不是每个组,因此,多个电子邮件组中的一个客户允许一个电子邮件地址,但其他任何客户都不允许相同的电子邮件地址

1 个答案:

答案 0 :(得分:2)

您不能直接在多个表上设置UNIQUE约束,我建议您可以采用以下一种方法。

  1. 您可以使用触发器在插入数据之前验证数据 并在禁止的情况下抛出错误。
  2. 插入自身时,您可以使用IF EXISTS检查是否允许数据。
  3. 创建一个Indexed View并对其施加唯一约束。

我的建议是,创建索引视图并放置所需的约束。要了解更多信息,可以查看Enforcing Complex Constraints with Indexed Views