【问题标题】:Duplicate error in transactions交易中的重复错误
【发布时间】: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


【解决方案1】:

在尝试更新之前检查 MachineNumber 是否存在。您可以使用EXISTSCOUNT

例如:

DECLARE @Exists INT

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

IF @Exists = 0
BEGIN
     -- Perform UPDATE
END

【讨论】:

  • 这个解决方案对我没有帮助,因为即使机器存在我也想更新记录
  • @user2023203 - 您有一个约束,阻止将具有相同 id 的多台机器插入到表中。我的回答将帮助您在不违反约束的情况下保持这种完整性。如果您希望更新现有机器,可以将查询调整为 `UPDATE tblProduces SET column = Value WHERE MachineNumber = @machinNum'
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多