【问题标题】:Unable to create relationship无法建立关系
【发布时间】:2016-07-03 22:55:29
【问题描述】:

我有一个 Orders 表,其中有一个 resellerID 列作为 Nullable 整数。在大多数记录中,resellerIDNULL,而有时它包含一个与 Resellers 表相关联的整数,该表包含 resellerIDresellerName 列。 p>

当我尝试添加两个 resellerID 之间的关系时,我收到以下错误:

- Unable to create relationship 'FK_Orders_Resellers'.  
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_Orders_Resellers". The conflict occurred in database "sales", table "dbo.Resellers", column 'resellerID'.

问题是Orders.resellerID 列的可空性质吗?这是一个糟糕的设计选择吗?我应该怎么做才能像专业人士一样修复?

数据库是由一位离开公司的程序员设计的,我可能想修复它。

谢谢。

编辑:即使Orders.resellerID 列仅包含 NULL 值,也会发生错误。

【问题讨论】:

标签: sql-server database


【解决方案1】:

您的订单表中的 null 值在您的转销商表中不可用,请创建名称中未分配的转销商,并将此值添加到您的订单表中,然后创建关系。

【讨论】:

  • Resellers.resellerID 是表键,定义为整数
  • 如果要创建关系,订单表中的 reserllerid 不能为空。转到您的经销商表创建一条新记录,获取新 id 并使用它来使用该值更新订单表,然后创建 realtionship
【解决方案2】:

您应该为 Resellers 创建一个默认值,当 Order 表对 Resellers 没有值时应该引用该值。有点像这样:

  1. 将订单表中的所有 NULL 替换为 -1。 UPDATE Orders SET resellerID = -1 WHERE resellerID IS NULL
  2. 在经销商表中插入默认值。 INSERT INTO Resellers (resellerID, resellerName) VALUES (-1, '');
  3. 应用您的 FK。
  4. 将所有代码加载 Orders.resellerID 更改为 COALESCE(resellerID, -1) Orders.resellerID 列设置默认值

【讨论】:

  • 我怀疑这个,这是最优雅的解决方法吗?当订单没有关联的经销商时,将其保留为 NULL 对我来说非常有意义...
  • @Alberto 很难说这是否是最优雅的方式。我更喜欢这个解决方案。
  • 我刚刚发现你可以用这种方式建立关系,检查这个:dba.stackexchange.com/questions/25323/…
  • 是的,我对此做了一些进一步的研究,在 FK 列中使用 NULL 应该没问题。
【解决方案3】:

与往常一样,问题出在列数据中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2014-06-27
    相关资源
    最近更新 更多