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.

質問が示唆するように、このテーブルの行は引き続き挿入されます (外部キー制約を適用していないかのように)

また、手動でデータを挿入することもテストしました-その場合、このエラーはスローされません。

これが私のテーブルのレイアウトと私が実行するスクリプトです。何が起こっているのか、なぜエラーがスローされるのかを知る必要があります:) 私が見落としているのは明らかなことだと思います。

テーブルレイアウト

脚本:

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 =@SUBCOUNTER + 1;
    END
    SET @SUBCOUNTER = 0;
    SET @COUNTER2 = @COUNTER2 + 1;
END

ロジックは、numbers_dummy テーブルには 150 行、ID = 1 ~ 150 の属性には 5 行、ID = 1 ~ 5 があることを示しています。 Numbers_Attributes_Bridge には 750 行が必要です。

上記のエラーが発生していますが、行はまだ挿入されています。

次のコード行は、手動テストでエラーをスローしませんでした。

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

何が起こっている?

4

1 に答える 1

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 =@SUBCOUNTER + 1;
    END
    SET @SUBCOUNTER = 1;
    SET @COUNTER2 = @COUNTER2 + 1;
END

NumberId または AttributeId = 0 の行を挿入しようとするとエラーが発生しますが、他のすべての行は適切に挿入されるため、いくつかのレコードが挿入されています

于 2013-03-19T08:41:05.273 に答える