【问题标题】:SQL Foreign Key Constraint or a static value?SQL 外键约束还是静态值?
【发布时间】:2012-11-05 01:43:35
【问题描述】:

我有两张桌子:

  • 客户(ID、姓名、HomeAddressId)
  • 地址(ID、街道、城市、州)

我想在 Customer 上放置一个外键约束,以便 HomeAddressId 有效,但我也想允许 -1 作为有效值(即使它不是 Address.Id 值之一)。这真的可能吗?而且,如果是这样……怎么办?

【问题讨论】:

    标签: sql constraints foreign-key-relationship sql-server-2012


    【解决方案1】:

    没有。外键是绝对的,外键中的值必须存在于它所引用的主键中。

    但是,您可以将外键列声明为 NULLable,然后将 NULL 用于“未知”或“未定义”值。

    【讨论】:

      【解决方案2】:

      如果是这样,您为什么不只允许Customers 表上的HomeAddressID 上的null 值?但是还是在上面加上foreign键约束。

      CREATE TABLE Customer
      (
          Id INT, 
          Name VARCHAR(50), 
          HomeAddressId INT NULL,
          CONSTRAINT tb_fk FOREIGN KEY (HomeAddressId) REFERENCES Address(ID)
      )
      

      【讨论】:

        【解决方案3】:

        您不能这样做,也不应该这样做。由于这是外键约束的主要规则,要保证数据的一致性。

        您可能需要添加一个新列,例如 IsValid 作为列值有效性的标志

        【讨论】:

          【解决方案4】:

          上述答案中的解决方案是正确的方法。但是,如果您仍然需要坚持使用 -1 方法,请在 Address 表中创建一个默认条目,ID 为 -1,所有其他列为 null 或“未知”。这样你的外键约束是有效的。

          【讨论】:

          • 当地址表中的 id 设置为自增时,这种方法会出现问题。同样,有一些方法可以处理它,但可以节省一些时间并使用其他人提到的解决方案。
          猜你喜欢
          • 2013-01-30
          • 1970-01-01
          • 2011-04-20
          • 1970-01-01
          • 2013-04-10
          • 2017-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多