【问题标题】:Create a trigger after DELETE and update selected statement在 DELETE 后创建触发器并更新所选语句
【发布时间】:2019-04-16 13:53:04
【问题描述】:

我想在每次将新行添加到 ArrayA 时创建一个触发器。

这是我使用的代码:

CREATE TRIGGER increasement
    AFTER INSERT
    ON ArrayA
    FOR EACH ROW
    EXECUTE PROCEDURE func_increasement();

添加了一行,我需要更新 ArrayB 中的字段,但问题是: 我需要知道已添加的新行的 ID,以便知道在 ArrayB 中增加哪一行。

这是我尝试过的:

CREATE OR REPLACE FUNCTION func_increasement()
    RETURNS trigger AS
$$
BEGIN
    IF (TG_OP = 'INSERT') THEN
        UPDATE ArrayB SET number = number + 1 
        WHERE ArrayB.id = ( SELECT ArrayA.arraya_id FROM ArrayA WHERE (SELECT COUNT(*) FROM ArrayA));
END;
$$ LANGUAGE plpgsql;

这是我用来获取行总数的查询。

    Select Count(*) from ArrayA; 

【问题讨论】:

    标签: sql postgresql database-trigger


    【解决方案1】:

    我认为您不需要该条件,因为您只想在 INSERT 事件之后运行触发器。此外,表ArrayB 中的初始值应该是 默认设置为 0 或在更新期间需要 COALESCE。此外,触发器应该有一个RETURN 语句。您可以返回 NEWNULL 以获得 AFTER 触发器,但如果您都不使用它们将会失败。

    CREATE OR REPLACE FUNCTION func_increasement()
        RETURNS trigger AS
    $$
    BEGIN
            UPDATE ArrayB SET number = coalesce(number,0) + 1 
                WHERE ArrayB.id =  NEW.arraya_id;
          RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    

    DEMO

    【讨论】:

      【解决方案2】:

      您可以使用 NEW.id 来引用表 ArrayA 中当前添加的行

      Mysql 维护对新添加行的引用作为 NEW 以防插入查询。

      【讨论】:

      • 你能扩展一下这个答案吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 2013-08-24
      相关资源
      最近更新 更多