2013-06-18 39 views
1

我有一個交易,更新表產生。它設定產品由某個機器製造。然而,如果這表中已經存在,我得到PRIMARY KEY約束「produces_PK」的交易中的重複錯誤

衝突。不能在對象'dbo.TblProduces'中插入 重複鍵。

我該如何解決這個問題?

這是交易:

create proc update_products_and_machine_proc @machinNum int, @productName varchar(10) as 
begin tran update_products_and_machine 
    update TblProduces set [email protected] 
    from TblProduces inner join TblMachine on TblMachine.machineNumber= 
    TblProduces.machineNumber inner join TblProduct on TblProduces.productNumber= 
    TblProduct.productNumber 
    where [email protected] and exists (select TblMachine.machineNumber 
    from TblMachine where TblMachine.isWorking='true') 
if @@ERROR <> 0 begin 
    rollback tran 
    goto on_error 
end 
commit tran update_products_and_machine 
on_error: Print 'ERROR'; 
+0

什麼是TblProduces的主鍵?你的'存在'子查詢只是檢查是否有任何工作機器,是否正確? –

+0

Produces是「Product」和「Machine」之間的連接表,因此productnumber和machinenumber是主鍵,並且是「produce」表中唯一的字段。此外,您正確 – user2023203

+0

此查詢是否嘗試將給定產品的所有machineNumbers更新爲TblProduces表中的同一個machineNum?這會導致主鍵錯誤。您需要將更新限制爲一個交叉引用記錄或先刪除無關記錄。 –

回答

2

檢查MachineNumber嘗試更新之前存在。您可以使用EXISTSCOUNT

例如:

DECLARE @Exists INT 

SELECT @Exists = COUNT(MachineNumber) 
FROM TblProduces 
WHERE MachineNumber = @machinNum 

IF @Exists = 0 
BEGIN 
    -- Perform UPDATE 
END 
+0

該解決方案對我沒有幫助,因爲即使機器存在,我也想更新記錄 – user2023203

+0

@ user2023203 - 您有一個限制,即將具有相同標識的多臺計算機停止插入表中。我的回答將幫助您在不違反約束的情況下保持這種完整性。如果您希望更新現有機器,您可以將查詢調整爲'UPDATE tblProduces SET column = Value WHERE MachineNumber = @machinNum' –

+0

Darren,當我使用您的解決方案時,仍然出現錯誤 – user2023203