【问题标题】:A constraint that only allows one of two tables to reference a base table仅允许两个表之一引用基表的约束
【发布时间】:2011-09-13 12:21:01
【问题描述】:

我有 3 张桌子。一个基表,称它为表A,以及两个引用表A的表,称它们为表X和表Y。X和Y都有一个引用表A的外键约束。X和Y的外键也是他们自己的主键。

我想知道是否可以添加一个约束,只允许其中一个表包含引用表 A 的记录。因此,如果 X 有一个引用 A 的记录,那么 Y 不能有一个如果 Y 有一条引用 A 的记录,那么 X 不能有一条。

这可能吗?

谢谢,

【问题讨论】:

  • 我很好奇您的用例。你的结构有些有趣。您有 3 个使用相同键值的主键。
  • 是的,它们是三个用于存储用户帐户的表。有两种类型的帐户。因此,有一个基表包含两种帐户类型共有的信息,然后是每个帐户类型的表,其中包含特定于该帐户类型的信息。因此,每个表的 PK 都是 UserID,因为我认为这会使事情变得连贯,并使通过 UserID 访问记录变得容易。

标签: sql sql-server sql-server-2008 constraints


【解决方案1】:

使用 UDF 的 CHECK 约束(这是 Oded 的回答)不能很好地扩展并且并发性很差。见这些:

所以:

  • 创建一个新表,比如 TableA2XY
  • 这有 TableA 的 PK 和一个带有 CHECK 的 char(1) 列,以允许只有 X 或 Y。并且对 A 的 PK 也有一个唯一约束。
  • tableX 和 tableY 具有新的 char(1) 列,并检查以分别只允许 X 或 Y
  • tableX 和 tableY 在两列上都有各自的 FK 到 TableA2XY

这是超键或子类型方法

  • 全部基于DRI
  • 没有触发器
  • 在 CHECK 约束中没有具有表访问权限的 udf。

【讨论】:

  • 我做的事情和你描述的差不多。最近我切换到在我的子表中添加一个持久的计算 CHAR(1) 列,这样它就不会出现在 SQL Prompt 自动生成的列列表中
【解决方案2】:

是的,这可以使用CHECK constraints

除了正常的外键约束外,您还需要在两个引用表上添加CHECK constraint,以确保另一个引用表中不使用外键。

【讨论】:

  • CHECK 需要一个不安全且缓慢的标量 udf。请看我的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
相关资源
最近更新 更多