SQL Server:添加外键错误

SQL Server:添加外键错误,sql,sql-server,sql-server-2012,foreign-keys,foreign-key-relationship,Sql,Sql Server,Sql Server 2012,Foreign Keys,Foreign Key Relationship,我有一个Microsoft SQL Server数据库,其中包含大约8个表,我正在尝试更新这些表。我创建临时表,删除现有表,将临时表重命名为最终名称,然后创建索引和外键约束以加快查找速度 问题是,当我尝试在重命名的表上创建外键约束时,我收到以下错误 ALTER TABLE语句与外键约束冲突 “FK\u维护\u间隔\u id”。数据库中发生冲突 “车辆数据”,表“维护间隔”,第列 “维护间隔\u id” 下面是导致问题的语句 ALTER TABLE VEH_ENG_MAINTENANCE_INTE

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

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

ALTER TABLE语句与外键约束冲突 “FK\u维护\u间隔\u id”。数据库中发生冲突 “车辆数据”,表“维护间隔”,第列 “维护间隔\u 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语句:

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吧

你有两个问题中的一个。首先也是最有可能的是,如果您以前没有约束,那么子表中的值在父表中不存在。您应该在尝试添加约束之前修复数据。您也可以使用NOCHECK进行检查,但这是一个非常糟糕的主意,因为如果该记录被更新,那么它将失败,除非fk字段被更改。至少它让你知道为什么需要FKS。不幸的是,很难知道在eparent表中放什么,因为键值是一个数字。谁知道927订单是什么,现在它已经不存在了,但你仍然有它的订单细节。您需要创建某种伪值(比如一个未知的记录来附加所有坏数据),或者您可能需要删除这些记录,这取决于您的业务规则和dat的含义。我们不能回答这个问题,当然,只有贵公司能回答。但一般来说,如果孤立记录中包含财务、监管或法律数据,则通常不会删除这些记录


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

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

FK本身表示,车辆工程维护间隔.maintenance间隔.maintenance间隔.id中的每个值都应该在maintenance间隔.maintenance间隔.id表/列中定义

因此,此查询将显示表中具有外键表中未包含的值的所有行

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

这将显示导致问题的所有行。查看维护间隔id值,并将其与维护间隔表中的值进行比较。您需要向后一个表中添加行,或者从您试图应用FK约束的表中删除“坏数据”。

您试图添加外键,但表中的数据不按规则播放-显然,您在
VEH\u ENG\u MAINTENANCE\u INTERVAL
中有一个数据,该数据在
MAINTENANCE\u INTERVAL\u id
中有一个值,但在
MAINTENANCE\u INTERVAL.MAINTENANCE\u INTERVAL\u id
-。。。。您需要首先修复数据问题-然后建立FK关系尝试运行此SQL以查看是否可以找到有关特定FK约束的信息:选择*FROM information_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE constraint_NAME=N'FK_LKP_VEH_E_maint_6B79F03D'。。假设您不知道此FK来自何处,因为它不是您试图添加的FK约束(如果您不知道,则应正确命名FK约束),为什么又问了相同的问题???可能重复和:我建议始终显式命名FK约束!还是你真的那么喜欢这些时髦的名字,比如《代码》FK_uLKP_VEH_E_uMaint_u6b79f03d?!?!?!使用
altertable。。。。添加约束(fk_CONSTRAINT_name)外键…..
为约束指定一个明确的名称,以便稍后引用(例如删除)