SQL Server 条件外键约束

6

我在创建外键约束时遇到了困难。我的数据模型已经固定,不受我的控制,看起来像这样:

CREATE TABLE Enquiry 
  (Enquiry_Ref INTEGER PRIMARY KEY CLUSTERED, Join_Ref INTEGER, EnquiryDate, EnquiryType...)

CREATE TABLE Contact 
  (Contact_Ref INTEGER PRIMARY KEY CLUSTERED, Surname, Forenames ....)

CREATE TABLE UniversalJoin 
  (Join_Ref INTEGER, Contact_Ref INTEGER, Rel_Type INTEGER)

每个询问都有一个联系人。它们之间的链接是UniversalJoin表。
Enquiry.Join_Ref = UniversalJoin.Join_Ref AND 
Rel_Type = 1 AND
UniversalJoin.Contact_Ref = Contact.Contact_Ref

Rel_Type的取值取决于源表,所以在Enquiry表中,Rel_Type为1,而对于另一个表,则可能设置为N。

我的问题是如何创建外键约束来保证这种关系的完整性?我想说的是:

CREATE TABLE Enquiry 
  ...
  CONSTRAINT FK_Foo 
  FOREIGN KEY (Join_Ref)
  REFERENCES UniversalJoin (JoinRef WHERE Rel_Type=1)
3个回答

5

在SQL Server中,您无法使用条件或过滤外键。

在这种情况下,您可以在(JoinRef,Rel_Type)之间拥有多列FK,并在UniversalJoin上设置对Rel_Type的检查约束使其为1。

但是,我认为您正在尝试拥有具有多个父项的行,这是不可能实现的。


4
您可能更愿意查看CHECK约束
CHECK约束通过限制列所接受的值来强制执行域完整性。它们类似于FOREIGN KEY约束,因为它们控制放入列中的值。不同之处在于它们确定哪些值是有效的:FOREIGN KEY约束从另一个表获取有效值列表,而CHECK约束根据不基于另一列中的数据的逻辑表达式确定有效值。

0

您可以使用带有INSERT和Update的表触发器来分层等效的外键。

这样,您就能够应用条件,例如如果列值=1,则检查表a中是否存在,如果列值=2,则检查另一个表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接