在我做了检查声明后如何更新我的记录?

时间:2014-11-28 01:57:34

标签: sql oracle

我已经在SQL中完成了一项任务。 我有这张桌子:

BIll (days integer,
      price real,
      numer  integer,
      total real);

我必须创建一个约束,说如果数字> 10总计得到-5。总共=天价格数字-5;否则总计=天数价格数字

代码:

ALTER TABLE bill ADD CONSTRAINT p CHECK (
  (number > 10 AND  total = number*price*days - 5)
  OR (number < 10 AND total = number*price*days)) 

我现在要做的事情(我发现有点奇怪)是做出更新,以2%的价格增加价格并增加总额。

以下是代码:

update bill
set price = price *0.02 + price ,total=  number*price*days

但它不会起作用。它说上面的限制是违反的。那我怎么能这样做呢?

1 个答案:

答案 0 :(得分:0)

约束是一直必须适用于表的所有行的规则。

如果任何插入或更新导致任何行使约束失败,则将回滚整个插入/更新并引发约束违规错误。

您可以选择处理此问题,您选择的问题取决于您的业务需求:

  1. 删除约束

  2. 仅更新更新

  3. 不会违反约束的行
  4. 暂时删除约束,运行更新,然后使用NOVALIDATE选项重新添加约束

  5. 根据您的业务要求,首选选项1或2。选项3有一些缺点(例如,违反约束的旧行在修复之前不会更新)。

    您的更新中的

    P.S。您可能会或可能不会意识到price是原始价格,而不是更新后的价格:

    update bill
    set price = price * 0.02 + price
       ,total = number * price * days
    

    例如,如果记录为(2,$ 10,11,$ 220),则在此更新后,价格将为$ 10 * 0.02 + $ 10 = $ 10.20,总价将为11 * $ 10 * 2 = $ 220(即赢得' t使用新价格计算总数。)

    我怀疑你的更新应该是:

    update bill
    set price = price * 0.02 + price
       ,total = (number * (price *0.02 + price) * days)
                - (case when number > 10 then 5 else 0 end)
    

    在我看来,您可能最好使用total的虚拟(生成)列。