违反PRIMARY KEY。无法在多对多关系中插入重复键

时间:2015-03-16 19:15:27

标签: sql sql-server tsql

我试图在多对多关系中插入表格:

DECLARE @TransactionTempTable Table
(
ID int IDENTITY(1,1) NOT NULL PRIMARY KEY
, OperationName nvarchar(100)
, CurrentAccountID int
, AmountMoney decimal
, ExecutionDate datetime    
, RateValue money
)

INSERT INTO @TransactionTempTable 
(OperationName, CurrentAccountID, AmountMoney, ExecutionDate, RateValue)
SELECT [Operation Name] AS OperatioName         
, A.AccountID AS CurrentAccountID
, dbo.Amount([AmountMin],[AmountMax]) AS AmountMoney
, Dates.item AS ExecutionDate
, 0 AS RateValue              
FROM ExcelDatabase.dbo.Transactions T
CROSS APPLY dbo.GenerateDate(GETDATE(),[Rate],[Period]) AS Dates
INNER JOIN Gurskiy_EconomicApp.DBO.Accounts A ON T.Account = A.AccountName

DECLARE @minID int = (SELECT MIN(ID) FROM @TransactionTempTable)
DECLARE @maxID int = (SELECT MAX(ID) FROM @TransactionTempTable)
DECLARE @lastID int
DECLARE @SplitCategories Table (CategoryName nvarchar(100) NOT NULL)

WHILE (@minID<=@maxID)
BEGIN
`INSERT INTO Gurskiy_EconomicApp.dbo.Transactions(CurrentAccountID,` `AmountMoney, ExecutionDate, RateValue)`


SELECT  
CurrentAccountID
            , AmountMoney
            , ExecutionDate
            , RateValue
        FROM @TransactionTempTable
        WHERE ID = @minID   
    SET @lastID = SCOPE_IDENTITY()
INSERT INTO @SplitCategories
SELECT * 
FROM Gurskiy_EconomicApp.dbo.fnSplit( 
    (SELECT 
        OperationName 
    FROM @TransactionTempTable 
    WHERE ID = @minID)
, ',')

INSERT INTO Gurskiy_EconomicApp.dbo.TransactionCategory(TransactionID, CategoryID)
SELECT 
    @lastID
    , C.CategoryID
FROM @SplitCategories AS SC
INNER JOIN  Gurskiy_EconomicApp.dbo.Categories AS C ON SC.CategoryName = C.CategoryName

SET @minID = @minID+1
END

这是我的代码。我不能在表TransactionCategory中插入CategoryID和TransactionID,但是表&#34; Transactions&#34;填写正确,表格类别也已填写。关于共和党人,我只是犯了一个简单的错误。但我在代码中找不到任何错误。帮助PLZ,这个任务在一天结束时吃掉了我的脑海。 TransactionCategory表的定义:

CREATE TABLE TransactionCategory
(
    CategoryID int NOT NULL,
    TransactionID int NOT NULL,
     CONSTRAINT transaction_category_pk PRIMARY KEY (CategoryID, TransactionID), 

CONSTRAINT FK_Category 
  FOREIGN KEY (CategoryID) REFERENCES Categories (CategoryID), 

 CONSTRAINT FK_Transaction 
      FOREIGN KEY (TransactionID) REFERENCES Transactions (TransactionID)
)

1 个答案:

答案 0 :(得分:1)

您尝试将@lastID, C.CategoryID插入TransactionCategory@lastID是由身份生成的,所以我假设它在每次迭代中都是不同的。我对吗?但是,@lastID在一次迭代中是常量,因此C.CategoryID必须是唯一的。 C.CategoryID来自Categories表,我也假设它是PK,因此此表中没有重复的类别标识符。你能证实吗?

这意味着将@SplitCategories加入Categories会导致重复。换句话说,在我看来@SplitCategories包含重复项。要确认,您可以在插入之前添加以下行,我们将看到:

select * from @SplitCategories

我认为问题可能出在fnSplit函数中。也许它以错误的方式分裂OperationName。您能否显示fnSplit的源代码和OperationName列中的示例数据?