2013-03-19 72 views
3

好日子外鍵約束衝突,但行仍插入?

一個奇怪的早晨,我有這個SQL腳本 - 我收到以下錯誤(因爲這個腳本是用來填充表了虛擬數據的腳本):

Msg 547, Level 16, State 0, Line 7 
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_ATTR". The conflict occurred in database "PhonebookDuplication", table "dbo.Attributes_Dummy", column 'Id'. 
The statement has been terminated. 

由於問題表明,這個表中的行仍然被插入(就好像它沒有強制執行外鍵約束)

我還測試了手動插入數據 - 它不會拋出這個錯誤。

這裏是我的表格和我執行的腳本的佈局。我需要知道發生了什麼,以及爲什麼它會拋出一個錯誤:)我敢打賭,我忽略了一些明顯的東西。

Table Layout

腳本:

use PhonebookDuplication; 

DROP TABLE Numbers_Attributes_Bridge; 
DROP TABLE Numbers_Dummy; 
DROP TABLE Attributes_Dummy; 


CREATE TABLE Numbers_Dummy 
      (
      Id int IDENTITY(1,1) PRIMARY KEY, 
      Number VARCHAR(20), 
      AccountId INT, 
      FirstName VARCHAR(20), 
      LastName VARCHAR(20) 
      ); 


CREATE TABLE Attributes_Dummy 
      (Id int IDENTITY(1,1) PRIMARY KEY, 
      AccountId INT, 
      Attribute VARCHAR(100) 
      ); 

CREATE TABLE Numbers_Attributes_Bridge 
      ( 
       NumberId int, 
       AttributeId int, 
       AccountId int, 
       Value Varchar(100) 
       CONSTRAINT PK_NA PRIMARY KEY 
       (
        NumberId ASC, 
        AttributeId ASC 
      ) 
       CONSTRAINT FK_Numbers FOREIGN KEY (NumberId) REFERENCES Numbers_Dummy(Id), 
       CONSTRAINT FK_ATTR FOREIGN KEY (AttributeId) REFERENCES Attributes_Dummy(Id), 
      ); 

DECLARE @COUNTER INT = 0; 
SET NOCOUNT ON 
WHILE (@COUNTER < 150) 
BEGIN 
    INSERT INTO Numbers_Dummy VALUES ('082'+CONVERT(varchar(15),@Counter),2000046,'Eon','du Plessis') 
    SET @COUNTER += 1; 
END 

SELECT COUNT(*) FROM Numbers_Dummy 

SET @COUNTER = 0; 
WHILE (@COUNTER < 5) 
BEGIN 
    INSERT INTO Attributes_Dummy VALUES (2000046,'Attribute'+CONVERT(varchar(15),@Counter)) 
    SET @COUNTER += 1; 
END 

SELECT COUNT(*) FROM Attributes_Dummy 

DECLARE @COUNTER2 INT = 0 ; 
DECLARE @SUBCOUNTER INT = 0; 
WHILE (@COUNTER2 <= 150) 
BEGIN 
    WHILE (@SUBCOUNTER <= 5) 
    BEGIN 
     INSERT INTO Numbers_Attributes_Bridge VALUES (@COUNTER2,@SUBCOUNTER,2000046, 'ATTRIBUTE-' + CONVERT(VARCHAR(100),@SUBCOUNTER)) 
     SET @SUBCOUNTER [email protected] + 1; 
    END 
    SET @SUBCOUNTER = 0; 
    SET @COUNTER2 = @COUNTER2 + 1; 
END 

邏輯上說,該numbers_dummy表將有150行,ID = 1〜150個 屬性將具有5行,ID = 1 - 5 Numbers_Attributes_Bridge應具有750行:NumberID = 1到150與AttributeID = 1到5的複合主鍵值

我得到上述錯誤,但行仍插入。

下面的代碼行手動測試沒有引發錯誤:

INSERT INTO Numbers_Attributes_Bridge VALUES (150,5,2000046, 'ATTRIBUTE-5') 

這是怎麼回事?

+1

從1開始計數,而不是0. – Arvo 2013-03-19 08:33:33

+0

請嘗試(15字符填充) – Eon 2013-03-19 08:36:33

+0

相同情況。仍然收到錯誤,但數據仍然會插入 – Eon 2013-03-19 08:37:42

回答

1

呦搞砸設有專櫃,嘗試下面的腳本:

DECLARE @COUNTER INT = 1; 
SET NOCOUNT ON 
WHILE (@COUNTER <= 150) 
BEGIN 
    INSERT INTO Numbers_Dummy VALUES ('082'+CONVERT(varchar(15),@Counter),2000046,'Eon','du Plessis') 
    SET @COUNTER += 1; 
END 

SELECT COUNT(*) FROM Numbers_Dummy 

SET @COUNTER = 1; 
WHILE (@COUNTER <= 5) 
BEGIN 
    INSERT INTO Attributes_Dummy VALUES (2000046,'Attribute'+CONVERT(varchar(15),@Counter)) 
    SET @COUNTER += 1; 
END 

SELECT COUNT(*) FROM Attributes_Dummy 

DECLARE @COUNTER2 INT = 1 ; 
DECLARE @SUBCOUNTER INT = 1; 
WHILE (@COUNTER2 <= 150) 
BEGIN 
    WHILE (@SUBCOUNTER <= 5) 
    BEGIN 
     INSERT INTO Numbers_Attributes_Bridge VALUES (@COUNTER2,@SUBCOUNTER,2000046, 'ATTRIBUTE-' + CONVERT(VARCHAR(100),@SUBCOUNTER)) 
     SET @SUBCOUNTER [email protected] + 1; 
    END 
    SET @SUBCOUNTER = 1; 
    SET @COUNTER2 = @COUNTER2 + 1; 
END 

當試圖用NumberId或屬性Id = 0插入行,但所有其他行插入以及你得到的錯誤,這就是爲什麼你有插入一些記錄

+0

謝謝。有效。 – Eon 2013-03-19 08:45:08

+0

我問的原因是因爲我不得不將150個更改爲150萬,並且每個運行的循環都會將錯誤消息拖入消息選項卡,並且完全搞砸了這個已經長期運行的腳本的性能 – Eon 2013-03-19 08:51:40

+0

很高興它有所幫助: ) – Sergio 2013-03-19 08:52:52