Postgres触发器 - 添加旧值和新值

时间:2015-11-30 01:20:21

标签: postgresql database-design triggers

我正在尝试使用一些简单的例子来学习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命令。

1 个答案:

答案 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 KEYserial列,例如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;