【问题标题】:How to make a column of table b unique only for different foreign key entries in table a如何使表 b 的列仅对表 a 中的不同外键条目唯一
【发布时间】:2019-02-11 11:20:57
【问题描述】:

假设有一个名为 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 中实现这种独特性?

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

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

【问题讨论】:

  • 所以一封邮件不能两次属于同一个组?在两列上使用唯一索引:Create Unique Indexes。试一试,如果它们不起作用,请发布您的尝试,并说明为什么它们没有起作用。
  • 请解释允许和不允许的逻辑,从结果中猜测既困难又耗时(并且容易出错)。还要解释你的表之间的链接。
  • 我很困惑。您提到了两张表,但示例数据似乎只来自一张。我认为您的数据模型有些问题,但是对于您提供的示例和表格,您将需要使用触发器。

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


【解决方案1】:

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

  1. 您可以使用触发器在数据插入之前对其进行验证 如果被禁止则抛出错误。
  2. 在插入自身时,您可以使用IF EXISTS 检查数据是否允许。
  3. 创建一个 Indexed View 并在其上设置 UNIQUE 约束。

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

【讨论】:

  • 带约束的索引视图解决了我的问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2011-01-31
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 2017-08-11
  • 2017-12-18
相关资源
最近更新 更多