使用PostgreSQL插入触发器来更新另一个表

41

我有一个名为"awards"的表。在PostgreSQL中,如何创建一个触发器,在每次对"awards"表进行插入操作时更新不同的表?


1
你能提供更多细节吗?这个“不同的表”是一个单独的表,还是基于奖项中某个字段的某个值而形成的多个表? - jcater
2
http://www.postgresql.org/docs/8.1/static/triggers.html - ertx
2
@ertx 最好链接到当前文档而不是8.1文档,因为那个已经极其过时了。 - Craig Ringer
不知道PostgreSQL文档有这个功能,谢谢Craig。 - ertx
2
@ertx:关于在meta.SO上引用PostgreSQL手册的更多信息。 - Erwin Brandstetter
2个回答

82

这里有两个名称为 table1table2 的表。使用触发器,在向 table1 中插入数据时,我会更新 table2

创建表格

CREATE TABLE table1
(
  id integer NOT NULL,
  name character varying,
  CONSTRAINT table1_pkey PRIMARY KEY (id)
)

CREATE TABLE table2
(
  id integer NOT NULL,
  name character varying
)

触发器函数

CREATE OR REPLACE FUNCTION function_copy() RETURNS TRIGGER AS
$BODY$
BEGIN
    INSERT INTO
        table2(id,name)
        VALUES(new.id,new.name);

           RETURN new;
END;
$BODY$
language plpgsql;

触发器

CREATE TRIGGER trig_copy
     AFTER INSERT ON table1
     FOR EACH ROW
     EXECUTE PROCEDURE function_copy();

3
在触发器函数中,它是如何知道要从表一插入值的?我们不需要在“values(new.id, new.name)”后面写“from table1”吗? - Andrew Ramnikov
4
new.id和new.name是来自table1表的值。 - minisaurus
1
这个新东西大小写敏感吗?newNEW 一样吗? - Abel Callejo

6
你想要PL/PgSQL触发器文档,其中讨论了这种情况以及其他情况。通用的触发器文档也可能有用。
你可以使用BEFOREAFTER触发器来实现此目的。我可能会使用AFTER触发器,这样我的触发器就可以看到插入行的最终版本。当然,你需要使用FOR EACH ROW

嗨,@Craig Ringer,FOR EACH ROW 的目的是用于批量插入吗? - rosenthal
1
@rosenthal 嗯?“FOR EACH STATEMENT”触发器无法访问“NEW”行。因此,即使您正在执行单行“INSERT”,它也对此没有用处。 - Craig Ringer
1
我并不是那个意思,抱歉我的措辞不当。我的意思是 FOR EACH ROW 是什么?我查看了 Postgres 的文档,现在明白了。“标记为 FOR EACH ROW 的触发器会在每次操作修改的每一行上调用一次。” - rosenthal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接