SQL Server条件外键约束

时间:2010-03-09 12:41:29

标签: sql-server ddl

我无法弄清楚如何创建外键约束。我的数据模型是固定的,不受我的控制,它看起来像这样:

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根据源表的不同而不同,因此在查询的情况下,Rel_Type为1,但对于另一个表,它将设置为N.

我的问题是如何创建外键约束来强制执行此关系的完整性?我想说的是,但不能,是:

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

3 个答案:

答案 0 :(得分:4)

您不能在SQL Server中使用条件或过滤外键

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

但是,我认为你试图与多个父母争吵,这是无法完成的。

答案 1 :(得分:3)

您可能希望查看CHECK Constraints

  

CHECK约束强制执行域   通过限制值来完整性   被列接受。他们是   类似于FOREIGN KEY约束   他们控制着的价值观   放在一个专栏中。区别在于   他们如何确定哪些值   有效:获取FOREIGN KEY约束   来自另一个的有效值列表   表和CHECK约束确定   来自逻辑的有效值   不基于数据的表达式   在另一栏中。

答案 2 :(得分:0)

您可以使用带有INSERT和Update的表触发器将等效项层叠为FK。

通过这种方式,您可以应用条件,即如果列值= 1则检查是否存在于表a中,如果列值= 2,则检查另一个表。