PostgreSQL触发器:将新行复制到其他表

4

我有一个问题困扰了我一段时间,所以我想寻求一点帮助。

我有两个表格,它们保存着相同的数据:transactions 和 transactions2。

我想编写一个触发器,在每次向 transactions 添加新行时触发,并将其插入到 PLSQL 的 transaction2 中。

首先,我只是通过以下方式复制了表格:

CREATE TABLE transactions2 (SELECT * FROM transactions WHERE 1=1);

我认为我已经找到了如何插入的方法:

CREATE OR REPLACE FUNCTION copyRow RETURNS TRIGGER AS $$ DECLARE BEGIN INSERT INTO transaction2 VALUES transaction; END;

我认为这个语法也是错误的,但我该如何指定触发器在第一个表格中进行新插入时立即启动呢?

有人能帮帮我吗?

谢谢 Bobby


你尝试过什么?你遇到了什么问题? - Eelke
首先,我只是使用“CREATE TABLE transactions2(SELECT * FROM.transactions WHERE 1 = 1);”复制了表格。 - BobbyP
我想我找到了如何插入以下代码的方法:CREATE OR REPLACE FUNCTION copyRow RETURNS TRIGGER AS $$ DECLARE BEGIN INSERT INTO transaction2 VALUES transaction; END;我认为这个语法也是错误的,但是我该如何表达触发器应该在第一个表格中进行新插入时立即启动? - BobbyP
1个回答

9

INSERT的正确语法是INSERT (<列名列表>) VALUES (<值列表>)。在函数中,INSERT的语法与“外部”没有区别。因此,您的触发器函数应该类似于:

CREATE OR REPLACE FUNCTION t2t2_f ()
RETURNS TRIGGER
AS
$$
BEGIN
  INSERT INTO transactions2
              (column_1,
               ...,
               column_n)
              VALUES (NEW.column_1,
                      ...,
                      NEW.column_n);

  RETURN NEW;
END;
$$
LANGUAGE plpgsql;

请将column_i替换为您表中实际的列名。 NEW是一个伪记录,您可以使用它来访问新行的值。

要创建触发器本身,请使用以下类似的语句:

CREATE TRIGGER t2t2_t
       AFTER INSERT
       ON transactions
       FOR EACH ROW
       EXECUTE PROCEDURE t2t2_f();

你可能希望使用其他的时间设置,例如使用BEFORE而不是AFTER
这应该能让你有一个起点。请考虑学习全面的PostgreSQL手册以获取更多详细信息。

谢谢您的快速和详细回答。只是为了更好地理解,我有一个问题。NEW 是指在事务中创建的新行,因为它在触发器本身中被指定了吗?我理解得对吗?再次感谢! - BobbyP
@BobbyP:听起来是这样的,是的。 - sticky bit
1
如果在父表中添加列,我不想更新“history”表和“function”。有没有一种自动维护“parent”表更改的方法? - J.Wincewicz

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