Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我应该使用什么触发器或约束?_Sql_Oracle_Triggers_Constraints - Fatal编程技术网

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

Sql 我应该使用什么触发器或约束?,sql,oracle,triggers,constraints,Sql,Oracle,Triggers,Constraints,在SQLDeveloper中,我创建了一个表 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 se

在SQLDeveloper中,我创建了一个表

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 )

我可以在触发器中使用更新吗

我也不这么认为,您的表不应该有
Total
列。相反,您应该有一个从
账单
中选择并计算
总额
的视图。差不多

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

约束只能防止将错误的值放入表中。若使用constraint,则需要计算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的advise。

这是我的项目中的请求。若要添加总计列,然后添加约束/触发器,使其行为类似于此,我得到此错误,则无法在触发器主体54029中更新虚拟列。0000-“无法在触发器正文中更新虚拟列”*原因:试图更改触发器正文中虚拟列的值*操作:这是无效的,请更改触发器定义。@AdiMuntean这将从根本上改变情况!如果使用虚拟列,首先应该提到它,然后在表的DDL中使用这个表达式。-还有,我如何在表的DDL中使用它?这就是请求:“创建一个包含这些列的表,总列是根据nr、天数和成本计算的。我创建的表是这样的:创建表账单(…总计为(nr*成本*天数));约束对您没有帮助,不需要触发器。相反,使用视图(根据Ash的回答)或生成的列。