SQL 服务器:添加外键错误

SQL Server : add foreign key error

我有一个大约 8 table 的 Microsoft SQL 服务器数据库,我正在尝试更新。我创建临时 tables,删除现有 tables,将临时 tables 重命名为其最终名称,然后创建索引和外键约束以加快查找速度。

问题是当我尝试在重命名的 table 上创建外键约束时,我收到以下错误。

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK__maintenance_interval_id". The conflict occurred in database "vehicle_data", table "MAINTENANCE_INTERVAL", column 'maintenance_interval_id'.

这是导致问题的语句

ALTER TABLE VEH_ENG_MAINTENANCE_INTERVAL
ADD CONSTRAINT FK_maintenance_interval_id FOREIGN KEY (maintenance_interval_id) 
REFERENCES MAINTENANCE_INTERVAL(maintenance_interval_id)

有人指出,这很可能是由于每个table的列中的数据不匹配造成的。有没有简单的方法来检查这个?两个 table 都有数千个条目。

创建 table 语句:

CREATE TABLE [vehicle_data].[dbo].[MAINTENANCE_INTERVAL]
[maintenance_interval_id] int,
[interval_type] varchar(32),
[value] decimal(18,2),
[units] varchar(32),
[initial_value] decimal(18,2),
PRIMARY KEY CLUSTERED ([maintenance_interval_id] ASC))

我认为这些是新 FK 吗?

您有两个问题之一。首先也是最有可能的是,如果您之前没有约束,那么 child table 中的值在 parent table 中不存在。您应该在尝试添加约束之前修复数据。您也可以使用 NOCHECK 来执行此操作,但这是一个特别糟糕的主意,因为如果该记录曾经更新过,那么除非更改 fk 字段,否则它将失败。至少它让您知道为什么需要 FKS。不幸的是,很难知道要放入什么 eparent table 是关键值是一个数字。谁知道 orderID 927 现在已经不存在了,但您仍然有它的订单详情。您可能需要创建某种假值(例如将所有不良数据附加到未知记录)或者您可能需要删除记录,这取决于您的业务规则和数据的含义。我们当然无法回答,只有贵公司可以。但一般情况下,如果孤立记录中有财务或监管或法律数据,一般不会删除。

另一种可能发生的情况是,如果您颠倒了 PK-FK 关系并试图将 parent table 变为 child。如果 parent 有一些从未在 child table 中使用过的有效值,这会导致失败。

FK 约束错误声称存在违反约束的情况,因此无法应用。

FK 本身是说 VEH_ENG_MAINTENEANCE_INTERVAL.maintenance_interval_id 中的每个值都应该在 MAINTENANCE_INTERVAL.maintenance_interval_id table/column 中定义。

因此此查询将向您显示 table 中具有不在外键 table 中的值的所有行。

SELECT * 
  FROM VEH_ENG_MAINTENANCE_INTERVAL 
 WHERE maintenance_interval_id NOT IN (SELECT maintenance_interval_id FROM MAINTENANCE_INTERVAL)

这将向您显示导致问题的所有行。查看 maintenance_interval_id 值并将它们与 MAINTENANCE_INTERVAL table 中的值进行比较。您需要向后者 table 添加行,或者从您尝试应用 FK 约束的 table 中删除 "bad data"。