2011-06-12 55 views
5

我有3个表。一个基表,称之为表A,两个表引用表A,称它们为表X和表Y.X和Y都有一个引用表A的外键约束.X和Y的外键也是它们自己的首要的关键。约束条件只允许两个表中的一个引用基表

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

这可能吗?

感谢,

+0

我会好奇你的用例。对你的结构有一些感兴趣的事情。您有3个主键使用相同的键值。 – NullRef 2011-06-12 21:46:30

+0

是的,他们是三个用于存储用户帐户的表。有两种类型的帐户。因此,有一个基表,其中包含两种类型帐户通用的信息,然后是每个帐户类型的表格,其中包含特定于该帐户类型的信息。因此,每张表的PK都是UserID,因为我认为这会使事情变得连贯一致,并且通过UserID轻松访问记录。 – 2011-06-14 13:08:18

回答

7

使用UDF检查约束(这是Oded的答案)不能很好地扩展并且并发性较差。看到这些:

所以:

  • 创建新表,说TableA2XY
  • 这个具有表A的PK和一个char(1)列使用CHECK来允许ony X或Y.并且对A的PK也有唯一的约束。
  • TableX的和tableY有新的炭(1)柱,用一个检查,以允许仅分别X或Y
  • TableX的和tableY具有它们FK到TableA2XY上两列

这是超密钥或亚型的方法

  • 所有DRI基于
  • 没有触发
  • 在CHECK约束表的访问没有的UDF。
+0

我和你所描述的完全一样。最近我切换到在子表中添加持久计算的CHAR(1)列,以便它不会显示在由SQL提示自动生成的列列表中 – 2011-06-12 21:19:58

1

是的,这是可能的使用CHECK constraints

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

+0

CHECK需要一个不安全且速度慢的标量udf。请看我的答案。 – gbn 2011-06-12 19:11:46

相关问题