Sql 即使数据确实存在,也会触发外键约束

Sql 即使数据确实存在,也会触发外键约束,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有两个表INTRFCTRL和INTERROR,都有标识列FILEID INTERROR附加了以下外键 ALTER TABLE [dbo].[INTERROR] WITH CHECK ADD CONSTRAINT [FK_INTERROR_0] FOREIGN KEY([FILEID]) REFERENCES [dbo].[INTRFCTRL] ([FILEID]) ON DELETE CASCADE GO ALTER TABLE [dbo].[INTERROR] CHECK CONST

我有两个表
INTRFCTRL
INTERROR
,都有标识列
FILEID

INTERROR附加了以下外键

ALTER TABLE [dbo].[INTERROR]  WITH CHECK 
ADD  CONSTRAINT [FK_INTERROR_0] FOREIGN KEY([FILEID])
REFERENCES [dbo].[INTRFCTRL] ([FILEID])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[INTERROR] CHECK CONSTRAINT [FK_INTERROR_0]
我正在将临时表中的数据插入
INTRFCTRL
中,然后尝试将相同的操作插入
INTERROR
中,并使用DBCC RESEED控制标识列值

我成功地运行了它,并且可以看到INTRFCTRL表中存在FILEID值67001

DBCC CHECKIDENT (INTRFCTRL, RESEED, 67000)
INSERT INTO dbo.INTRFCTRL SELECT FILEHASH,CASENO,INTNO,FILENAM,... 
FROM INTRFCTRL_TEMP
当我试着跑的时候

DBCC CHECKIDENT (INTERROR, RESEED, 67000)
INSERT INTO dbo.INTERROR SELECT INTRFLINENO,CASENO... FROM INTERROR_TEMP
我明白了

INSERT语句与外键约束冲突 “FK_Interor_0”。数据库“ESSDEV”表中发生冲突 “dbo.INTRFCTRL”,列“FILEID”

但我可以在INTRFCTRL中看到数据


我做错了什么?

我建议使用
输出
子句,而不是操纵
标识
值:

我正在将临时表中的数据插入INTRFCTRL,然后尝试将相同的操作插入INTERROR


尝试在INTERROR上禁用IDENTITY\u INSERT,并从INTRFCTRL表中获取文件ID值

可能INTRFCTRL_TEMP和INTROR_TEMP的行数不同。
DECLARE @MyTableVar table(identity_col INT, file_id INT );

INSERT INTO dbo.INTRFCTRL(col_list, ...)
OUTPUT inserted.identity_col, inserted.file_id  --get inserted identity value
INTO @MyTabVar
SELECT FILEHASH,CASENO,INTNO,FILENAM,... 
FROM INTRFCTRL_TEMP;

SET IDENTITY_INSERT dbo.INTERROR ON;

INSERT INTO dbo.INTERROR(col_list, ...)
SELECT t.identity_col, INTRFLINENO,CASENO... 
FROM INTERROR_TEMP it
JOIN @MyTabVar t
  ON it.fileId = t.File_id;

SET IDENTITY_INSERT dbo.INTERROR OFF;