我无法弄清楚如何创建外键约束。我的数据模型是固定的,不受我的控制,它看起来像这样:
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)
答案 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,则检查另一个表。