我有3个表。一个基表,称之为表A,两个表引用表A,称它们为表X和表Y.X和Y都有一个引用表A的外键约束.X和Y的外键也是它们自己的首要的关键。约束条件只允许两个表中的一个引用基表
我想知道是否有可能添加一个约束,只允许这些表中的一个包含引用表A的recrod。所以如果X有一个引用A的记录,那么Y不能有一个,如果Y有一个引用A的记录,那么X就不能有一个。
这可能吗?
感谢,
我有3个表。一个基表,称之为表A,两个表引用表A,称它们为表X和表Y.X和Y都有一个引用表A的外键约束.X和Y的外键也是它们自己的首要的关键。约束条件只允许两个表中的一个引用基表
我想知道是否有可能添加一个约束,只允许这些表中的一个包含引用表A的recrod。所以如果X有一个引用A的记录,那么Y不能有一个,如果Y有一个引用A的记录,那么X就不能有一个。
这可能吗?
感谢,
使用UDF检查约束(这是Oded的答案)不能很好地扩展并且并发性较差。看到这些:
所以:
这是超密钥或亚型的方法
我和你所描述的完全一样。最近我切换到在子表中添加持久计算的CHAR(1)列,以便它不会显示在由SQL提示自动生成的列列表中 – 2011-06-12 21:19:58
是的,这是可能的使用CHECK constraints。
除了正常的外键约束之外,还需要在两个引用表上添加一个CHECK constraint,以确保在其他引用表中不使用外键。
CHECK需要一个不安全且速度慢的标量udf。请看我的答案。 – gbn 2011-06-12 19:11:46
我会好奇你的用例。对你的结构有一些感兴趣的事情。您有3个主键使用相同的键值。 – NullRef 2011-06-12 21:46:30
是的,他们是三个用于存储用户帐户的表。有两种类型的帐户。因此,有一个基表,其中包含两种类型帐户通用的信息,然后是每个帐户类型的表格,其中包含特定于该帐户类型的信息。因此,每张表的PK都是UserID,因为我认为这会使事情变得连贯一致,并且通过UserID轻松访问记录。 – 2011-06-14 13:08:18