繁体   English   中英

SQL Server:添加外键错误

[英]SQL Server : add foreign key error

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

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

ALTER TABLE语句与FOREIGN KEY约束“ FK__maintenance_interval_id”冲突。 数据库“ vehicle_data”的表“ MAINTENANCE_INTERVAL”的列“ 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)

人们指出,这很可能是由于每个表的列中的数据不匹配所致。 有一个简单的方法来检查吗? 两个表都有数千个条目。

创建表语句:

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约束错误声称存在违反约束的情况,因此无法应用。

FK本身说VEH_ENG_MAINTENEANCE_INTERVAL.maintenance_interval_id中的每个值都应在MAINTENANCE_INTERVAL.maintenance_interval_id表/列中定义。

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

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

这将向您显示所有导致问题的行。 查看maintenance_interval_id值,并将它们与MAINTENANCE_INTERVAL表中的值进行比较。 您将需要在后一个表中添加行,或者从要对其应用FK约束的表中删除“不良数据”。

我认为这些是新的FK?

您有两个问题之一。 首先,最有可能的是,如果之前没有约束,那么子表中的值将不存在于父表中。 您应在尝试添加约束之前修复数据。 您也可以使用NOCHECK来执行此操作,但这是一个特别糟糕的主意,因为如果该记录曾经被更新,那么除非fk字段被更改,否则它将失败。 至少它使您了解为什么需要FKS。 不幸的是,很难知道在表中放入什么是键值是数字。 谁知道orderID 927现在已经不存在,但您仍然需要订单详细信息。 您艾米需要创建某种假值(例如将未知数据附加到未知记录),或者您可能需要删除记录,这取决于您的业务规则和数据的含义。 当然,只有您的公司才能做到这一点。 但是通常,如果孤立记录中包含财务,法规或法律数据,则通常不会删除它们。

另一个可能发生的情况是,如果您的PK-FK关系被逆转并且正在尝试使父表成为子表。 如果父级具有一些从未在子级表中使用的有效值,则可能会导致失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM