【发布时间】:2013-06-18 14:03:00
【问题描述】:
我有一个更新表产生的事务。它设置一个 product 由某个 machine 制造。但是,如果这个 machine 已经存在于表中,我会得到 p>
违反 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 machineNumber=@machinNum
from TblProduces inner join TblMachine on TblMachine.machineNumber=
TblProduces.machineNumber inner join TblProduct on TblProduces.productNumber=
TblProduct.productNumber
where TblProduct.productName=@productName 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';
【问题讨论】:
-
TblProduces的主键是什么?您的
exists子查询只是检查是否有任何工作机器,对吗? -
Produces是“Product”和“Machine”之间的连接表,因此productnumber和machinenumber是主键,是“produces”表中唯一的字段。另外,你是对的
-
此查询是否尝试将给定产品的所有 machineNumbers 更新为 TblProduces 表中的同一 machineNum?这会导致主键错误。您要么需要将更新限制为一个交叉引用记录,要么先删除无关记录。
标签: sql sql-server database stored-procedures transactions