PostgreSQL创建触发器:插入操作时出现语法错误

时间:2020-05-25 20:26:09

标签: sql postgresql postgresql-triggers

我想在PostgreSQL中创建一个触发器。

我有一个产品表和一个类别表。如果将一个新的元组与category_id插入到products表中,但该元组尚不存在,我想使用此确切的category_id创建一个类别。我写了一些SQL代码,但在第6行的“ INSERT”处收到语法错误。

我的代码如下:

CREATE TRIGGER ProductTrig
  AFTER INSERT ON products
  REFERENCING NEW ROW AS newrow
  FOR EACH ROW
  WHEN (newrow.category_id NOT IN (SELECT category_id FROM categories))
  INSERT INTO categories (category_id) VALUES (newrow.category_id);

有人看到这个问题吗?感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

documentation for CREATE TRIGGER中,您可以看到语句的末尾必须是EXECUTE PROCEDURE,后跟存储过程名称。在查询中,指定不符合这些要求的INSERT子句。

您需要在存储过程中构造INSERT子句,然后在CREATE TRIGGER语句的末尾引用它。 documentation for CREATE PROCEDURE可以为您提供帮助。

答案 1 :(得分:0)

如您在docs中所见,编写了一个在触发器之后运行的函数。

例如:

CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
    ON table_name
    [ FROM referenced_table_name ]
    [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
    [ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ]
    [ FOR [ EACH ] { ROW | STATEMENT } ]
    [ WHEN ( condition ) ]
    EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments )

where event can be one of:

    INSERT
    UPDATE [ OF column_name [, ... ] ]
    DELETE
    TRUNCATE