Postgresql-触发插入然后截断表

问题描述 投票:0回答:1

在使用转换表上的 Qfield 收集数据后,我正在使用转换表导入源表中的行。

此功能非常适合导入行:

CREATE OR REPLACE FUNCTION shema.function_name()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
BEGIN
    INSERT INTO
        shema.transition_table (field1, field2, field3)
        VALUES(NEW.*);

           RETURN new;
    
END;
$BODY$;

这是触发器(在转换表内)

CREATE OR REPLACE TRIGGER trigger_name
    AFTER INSERT
    ON shema.transition_table
    FOR EACH ROW
    EXECUTE FUNCTION shema.function_name();

它运行良好,但现在我想在导入后截断转换表。

我尝试过很多事情,但都失败了。我是一个有触发器的初学者。

你能帮我添加这个截断吗?

谢谢你。

它运行良好,但现在我想在导入后截断转换表。

我尝试过很多事情,但都失败了。我是一个有触发器的初学者。

你能帮我添加这个截断吗?

谢谢你。

postgresql triggers plpgsql
1个回答
0
投票

您正在显示一个触发器,该触发器试图将所有相同的行插入到完全相同的表中,从而陷入无限循环。

我的猜测是您的意思是让触发器将最新的插入有效负载保存到不同的表中,首先擦除它:

CREATE OR REPLACE FUNCTION shema.function_name()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
BEGIN
    TRUNCATE TABLE shema.transition_table2;
    INSERT INTO shema.transition_table2 (field1, field2, field3)
    VALUES(NEW.*);
    
    RETURN new;
END;
$BODY$;

如果您打算“重新路由”行,并且每当它们插入到

table1
中时,您希望触发器将它们插入到
table2
中,然后从
table1
擦除它们 - 您可以将其设为
before
重新路由插入后返回
null
的触发器。它有效地阻止行到达
table1
:

CREATE OR REPLACE FUNCTION shema.function_name()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
BEGIN
    INSERT INTO shema.transition_table2 (field1, field2, field3)
    VALUES(NEW.*);
    
    RETURN null;
END;
$BODY$;


CREATE OR REPLACE TRIGGER trigger_name
    BEFORE INSERT
    ON shema.transition_table1
    FOR EACH ROW
    EXECUTE FUNCTION shema.function_name();
© www.soinside.com 2019 - 2024. All rights reserved.