【问题标题】:SQL Server Conditional Foreign Key ConstraintsSQL Server 条件外键约束
【发布时间】:2010-03-09 12:41:29
【问题描述】:

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

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)

【问题讨论】:

    标签: sql-server ddl


    【解决方案1】:

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

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

    但是,我认为您正在尝试与多个父母发生争执,这是无法做到的。

    【讨论】:

      【解决方案2】:

      你可能更想看看CHECK Constraints

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

      【讨论】:

        【解决方案3】:

        您可以使用带有 INSERT 和 Update 的表触发器来将等价物分层为 FK。

        这样您就可以应用条件,即如果列值 =1 检查表 a 中存在如果列值 = 2 然后检查另一个表。

        【讨论】:

          猜你喜欢
          • 2017-06-17
          • 2011-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-01
          • 2016-02-01
          相关资源
          最近更新 更多