【问题标题】:syntax error at or near "AS" in creating trigger in postgresql在 postgresql 中创建触发器时在“AS”处或附近出现语法错误
【发布时间】:2020-10-14 03:45:37
【问题描述】:

早安,

我的查询有问题,因为我似乎无法理解为什么我不断收到错误“在“AS”处或附近出现语法错误,这是我的查询:

    CREATE TRIGGER  updateAvailableQuantity
    AFTER INSERT ON sale_item FOR EACH ROW 
    AS $$
    BEGIN
        IF NEW.quantity > 0 THEN
        UPDATE products
        SET products.quantity_instock = products.quantity_instock - NEW.quantity WHERE barcode =  NEW.barcode;
        END IF;
    END;
    $$ LANGUAGE plpgsql;

我不断遇到的错误是,

    ERROR:  syntax error at or near "AS"
    LINE 4: AS $$
            ^
    SQL state: 42601
    Character: 100

【问题讨论】:

    标签: sql postgresql triggers


    【解决方案1】:

    您不能以这种方式在 PostgreSQL 中编写触发器。这是一个两步的过程。

    1. 首先创建一个Trigger函数:
    CREATE OR REPLACE FUNCTION updateAvailableQuantity()
    RETURNS TRIGGER
    AS
    $$
    BEGIN
        IF NEW.quantity > 0 THEN
        UPDATE products
        SET quantity_instock = quantity_instock - NEW.quantity WHERE products.barcode =  NEW.barcode;
        END IF;
    
    RETURN NULL;
    END;
    $$ LANGUAGE plpgsql;
    
    1. 然后在您的表上编写触发器以调用如下函数:
    CREATE TRIGGER  trg_updateAvailableQuantity
    AFTER INSERT ON sale_item 
    FOR EACH ROW 
    EXECUTE PROCEDURE updateAvailableQuantity();
    

    【讨论】:

    • 谢谢!最后,它奏效了。我完全是个谜,为什么这不起作用,在 mysql 工作台中,它工作得很好。
    【解决方案2】:

    您的语法有错误。请参阅create trigger 上的documentation page

    FOR EACH ROW 不能放在REFERENCING AS 语句之前。

    文档也有很多例子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 2020-02-05
      • 1970-01-01
      相关资源
      最近更新 更多