首页 > 解决方案 > SQL 更新与检查约束错误冲突

问题描述

我正在尝试更新存储过程中的一些数值

SET SubTotal = SubTotal + @ExtCost
                , GST = SubTotal * 0.05
                , Total = SubTotal + GST
            WHERE JobNumber = @JobNumber

@ExtCost并且@JobNumber都是有效的并且工作正常。

我收到此错误:

UPDATE 语句与 CHECK 约束“ck_SubTotalandTotal”冲突

检查约束是Total > SubTotal

逻辑对我来说似乎很好,但我不知道为什么它不起作用:(

标签: sqldml

解决方案


以具有以下值的记录为例:

  • 小计:10
  • 消费税:0.5
  • 总计:10.5

现在您使用 2 的 @extCost 执行更新

SET 
  SubTotal = SubTotal + @ExtCost, 
  GST = SubTotal * 0.05, 
  Total = SubTotal + GST
WHERE JobNumber = @JobNumber

在更新过程中,当前值被用来填充列值,所以这与

SET 
  SubTotal = 10 + 2, 
  GST = 10 * 0.05, 
  Total = 10 + 0.05
WHERE JobNumber = @JobNumber

因此(小计)12 >(总计)10.05 导致约束问题。

您想要的是考虑计算值,因此您需要对每个字段进行计算。

SET 
  SubTotal = SubTotal + @ExtCost, 
  GST = (SubTotal + @ExtCost) * 0.05, 
  Total = (SubTotal + @ExtCost) + ((SubTotal + @ExtCost) * 0.05)
WHERE JobNumber = @JobNumber

或更短

SET 
  SubTotal = SubTotal + @ExtCost, 
  GST = (SubTotal + @ExtCost) * 0.05, 
  Total = (SubTotal + @ExtCost) * 1.05
WHERE JobNumber = @JobNumber

推荐阅读