簡體   English   中英

即使存在數據,也會觸發外鍵約束

[英]Foreign key constraint triggered even though data does exist

我有兩個表INTRFCTRLINTERROR ,都具有IDENTITY列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表中存在文件ID 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語句與FOREIGN KEY約束“ FK_INTERROR_0”沖突。 數據庫“ ESSDEV”的表“ dbo.INTRFCTRL”的列“ FILEID”中發生了沖突。

但是我可以在INTRFCTRL中看到數據

我究竟做錯了什么?

我建議使用OUTPUT子句,而不要操縱IDENTITY值:

我將臨時表中的數據插入INTRFCTRL,然后嘗試將同樣的數據插入INTERROR

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;

嘗試將INTERROR上的IDENTITY_INSERT設置為OFF,然后從INTRFCTRL表中獲取FILEID值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM