我应该使用什么触发器或约束?

时间:2014-11-11 08:39:45

标签: sql oracle triggers constraints

在sql Developer中我创建了一个表

Bill (id,nr,cost,days,total -all integers)

我需要创建一个约束(或触发器 - 最好),就像

一样
IF nr > 10 then total = total -5 (total = nr * cost * days ).


CREATE OR REPLACE TRIGGER discount 
AFTER INSERT OR UPDATE ON Bill 
UPDATE Bill  
    set total = nr * cost * nr - 5;
WHEN (nr_slide > 10 )

我可以使用更新内部触发器吗?

2 个答案:

答案 0 :(得分:1)

我也不说,你的桌子不应该有Total列。相反,您应该有一个从Bill中选择并计算Total的视图。像

这样的东西
SELECT 
    id, 
    nr, 
    days, 
    CASE WHEN nr > 10 THEN 
        (nr * cost * days) - 5 
    ELSE 
        (nr * cost * days) 
    END AS 'Total'
FROM view_Bill

答案 1 :(得分:0)

约束只能防止将错误的值放到表中。如果使用约束,则需要计算total的正确值并插入表中,否则不会插入任何行。这意味着你需要一个触发器。

CREATE OR REPLACE TRIGGER discount 
AFTER INSERT OR UPDATE ON Bill 
for each row -- I added it here
begin
  IF :new.nr > 10 then 
     :new.total = :new.nr * :new.cost * :new.days - 5;
  END IF;
end;

如果这是一个教育项目 - 没问题(当然,这是一个问题 - 这是教育的一个非常糟糕的例子)。在现实生活的应用中使用Ash Burlaczenko的建议。