Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 仅允许两个表中的一个引用基表的约束_Sql_Sql Server_Sql Server 2008_Constraints - Fatal编程技术网

Sql 仅允许两个表中的一个引用基表的约束

Sql 仅允许两个表中的一个引用基表的约束,sql,sql-server,sql-server-2008,constraints,Sql,Sql Server,Sql Server 2008,Constraints,我有三张桌子。一个基表称为表A,两个引用表A的表称为表X和表Y。X和Y都有一个引用表A的外键约束。X和Y的外键也是它们自己的主键 我想知道是否可以添加一个约束,该约束只允许其中一个表包含引用表a的recrod。因此,如果X有一条引用a的记录,那么Y不能有一条,如果Y有一条引用a的记录,那么X不能有一条 这可能吗 谢谢,是的,这是可以使用的 除了普通的外键约束外,您还需要在两个引用表上都添加一个外键,以确保在另一个引用表中不使用外键。使用UDF检查约束(这是Oded的答案)扩展性不好,并发性差。请

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

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

这可能吗


谢谢,

是的,这是可以使用的


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

使用UDF检查约束(这是Oded的答案)扩展性不好,并发性差。请看这些:

因此:

  • 创建一个新表,比如TableA2XY
  • 它有TableA的PK和一个char(1)列,该列带有一个允许onyx或Y的检查,并且对a的PK也有一个唯一的约束
  • tableX和tableY有一个新的char(1)列,该列带有一个复选框,分别只允许X或Y
  • tableX和tableY的FK到TableA2XY位于两列上
这是超级键或子类型方法

  • 全部基于
  • 没有触发器
  • 检查约束中没有具有表访问权限的UDF
检查需要标量udf,该udf不安全且速度慢。请看我的答案。我做的事情和你描述的差不多。最近,我切换到在我的子表中添加一个持久化的computed CHAR(1)列,这样它就不会出现在SQL PromptI自动生成的列列表中。我想知道您的用例。你的结构有点有趣。您有3个使用相同键值的主键。是的,它们是用于存储用户帐户的三个表。有两种类型的帐户。因此,有一个基本表,其中包含两种类型的帐户所共有的信息,然后每个帐户类型都有一个表,其中包含特定于该帐户类型的信息。所以每个表的PK都是UserID,因为我认为这将使事情变得连贯,并使通过UserID访问记录变得容易。