违反主键。无法在多对多关系中插入重复键
Violation of PRIMARY KEY. Cannot insert duplicate keys in many-with-many relationship
我正在尝试在多对多关系中插入 table:
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
这是我的代码。我无法在 table TransactionCategory 中插入 CategoryID 和 TransactionID,但是 table "Transactions" 填写正确并且 table 类别也已填写。关于重复,我只是犯了一个简单的错误。但是我在我的代码中找不到任何错误。请帮忙,这项任务最终让我心烦意乱。
TransactionCategory 的定义 table:
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)
)
您尝试将 @lastID, C.CategoryID
插入 TransactionCategory
。 @lastID
是由身份生成的,所以我假设它在每次迭代中都是不同的。我对吗?但是,@lastID
在单次迭代中是常量,因此 C.CategoryID
必须是唯一的。 C.CategoryID
来自 Categories
table 我也假设它是 PK 所以在这个 table 中没有重复的类别标识符。你能确认一下吗?
意思是@SplitCategories
和Categories
连接造成重复。换句话说,在我看来 @SplitCategories
包含重复项。为了确认,您可以在插入之前添加以下行,我们将看到:
select * from @SplitCategories
我认为问题可能出在 fnSplit
函数中。也许它以错误的方式拆分 OperationName
。您能否显示 fnSplit
的源代码和 OperationName
列中的示例数据?
我正在尝试在多对多关系中插入 table:
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
这是我的代码。我无法在 table TransactionCategory 中插入 CategoryID 和 TransactionID,但是 table "Transactions" 填写正确并且 table 类别也已填写。关于重复,我只是犯了一个简单的错误。但是我在我的代码中找不到任何错误。请帮忙,这项任务最终让我心烦意乱。 TransactionCategory 的定义 table:
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)
)
您尝试将 @lastID, C.CategoryID
插入 TransactionCategory
。 @lastID
是由身份生成的,所以我假设它在每次迭代中都是不同的。我对吗?但是,@lastID
在单次迭代中是常量,因此 C.CategoryID
必须是唯一的。 C.CategoryID
来自 Categories
table 我也假设它是 PK 所以在这个 table 中没有重复的类别标识符。你能确认一下吗?
意思是@SplitCategories
和Categories
连接造成重复。换句话说,在我看来 @SplitCategories
包含重复项。为了确认,您可以在插入之前添加以下行,我们将看到:
select * from @SplitCategories
我认为问题可能出在 fnSplit
函数中。也许它以错误的方式拆分 OperationName
。您能否显示 fnSplit
的源代码和 OperationName
列中的示例数据?