2017-08-14 14 views
1

我有兩個表INTRFCTRLINTERROR,都帶有標識列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控制標識列值

我成功運行這一點,可以看出,67001的FILEID值出現在INTRFCTRL表

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

數據我在做什麼錯?

+0

可能是INTRFCTRL_TEMP和INTERROR_TEMP有不同數量的行。 – Serg

回答

2

我會建議使用,而不是操縱IDENTITYOUTPUT條款:

我從一個臨時表到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; 
0

嘗試在INTERROR上設置IDENTITY_INSERT OFF並從INTRFCTRL表中獲取FILEID值。