我正在尝试使用一些简单的例子来学习Postgres触发器。我创建了一个简单的表:
create table emp (empname text, salary integer, last_user text);
我的目标是用新工资替换旧工资,计算工资插入(新)+旧工资。即使我没有提出条件,我也无法得到它们(即empname
是相同的)
这是我的代码:
-- this table returns a new row instead of summing
CREATE OR REPLACE FUNCTION emp_stamp() RETURNS trigger
AS $emp_stamp$
BEGIN
new.salary = new.salary + old.salary ;
RETURN NEW;
END;
$emp_stamp$ LANGUAGE plpgsql;
CREATE TRIGGER emp_stamp
BEFORE UPDATE on emp
FOR EACH ROW
EXECUTE PROCEDURE emp_stamp();
当我插入表格时,我添加了一个新行,并且没有现有行符合公式:
INSERT INTO EMP VALUES('BR',39970,'BR')
我还没有成功尝试UPDATE
命令。
答案 0 :(得分:1)
您的CREATE TRIGGER
脚本说BEFORE UPDATE
。因此,INSERT
命令根本不触发此触发器。
此外,相同的触发函数无论如何都会引发INSERT
命令的错误,因为很明显,新插入的行没有“旧”版本。
它应该像UPDATE
那样正常工作。我刚刚清理了一下:
CREATE OR REPLACE FUNCTION emp_stamp()
RETURNS trigger AS
$func$
BEGIN
NEW.salary := NEW.salary + OLD.salary;
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
CREATE TRIGGER emp_stamp
BEFORE UPDATE ON emp
FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
只是一个概念证明,我没有看到添加旧值的重点。
对于初学者,您的表格需要适当的PRIMARY KEY
,serial
列,例如empname
几乎不是唯一的:
CREATE TABLE emp (
emp_id serial PRIMARY KEY
, empname text
, salary integer
, last_user text);
然后UPDATE
可以可靠地运作:
UPDATE EMP
SET salary = 39970
WHERE emp_id = 123;
我仍然没有看到提到的触发器是如何有意义的。您可以增加这样的现有薪水,不涉及触发器:
UPDATE EMP
SET salary = salary + 39970
WHERE emp_id = 123;