我已经在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
但它不会起作用。它说上面的限制是违反的。那我怎么能这样做呢?
答案 0 :(得分:0)
约束是一直必须适用于表的所有行的规则。
如果任何插入或更新导致任何行使约束失败,则将回滚整个插入/更新并引发约束违规错误。
您可以选择处理此问题,您选择的问题取决于您的业务需求:
删除约束
仅更新更新
暂时删除约束,运行更新,然后使用NOVALIDATE选项重新添加约束
根据您的业务要求,首选选项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
的虚拟(生成)列。