我尝试在这里使用触发器。 我有这样的关系:
salary(salaryid, userid, netsalary, reward, totalsalary)
因此,每次插入和更新totalsalary
或netsalary
时,我都要更新reward
,它会重新计算:totalsalary = netsalary + reward
。
为此,我做了一个功能和一个触发器:
CREATE FUNCTION reCount()
RETURNS TRIGGER AS $function$
BEGIN
UPDATE salary SET totalsalary = netsalary + reward;
RETURN NEW;
END;
CREATE TRIGGER updateTotalsalary
AFTER INSERT OR UPDATE
ON salary
FOR EACH ROW
EXECUTE PROCEDURE reCount();
最后,我尝试通过这样的查询插件进行测试:
INSERT INTO salary(salaryid,userid,netsalary,reward,totalsalary)
VALUES (1234,123, 30,2,30);
但它运行了很长时间,似乎永远不会停止。因此,当试图阻止它时,我得到了许多行:
SQL语句" UPDATE工资SET totalsalary = netsalary + reward"
PL / pgSQL函数" reCount()" SQL语句中的第3行
那么问题是什么。希望你们能给我一些建议吗?
答案 0 :(得分:0)
尝试:
CREATE TRIGGER updateTotalsalary
AFTER INSERT OR UPDATE
ON salary
FOR EACH ROW
WHEN (pg_trigger_depth() = 0)
EXECUTE PROCEDURE reCount();
答案 1 :(得分:0)
这可能比pg_trigger_depth() = 0
黑客更好:
CREATE TRIGGER updateTotalsalary
AFTER INSERT OR UPDATE OF netsalary, reward
ON salary
FOR EACH ROW
EXECUTE PROCEDURE reCount();
对于UPDATE事件,可以使用指定列的列表 这句语法:
更新了column_name1 [,column_name2 ...]
只有至少有一个列出的列时,触发器才会触发 提到作为UPDATE命令的目标。
虽然我个人可能会选择没有总计列的表格及其中的视图(CREATE TABLE salary_ ...
,CREATE VIEW salary AS SELECT ..., (salary + reward) AS totalsalary FROM salary_
)。