【问题标题】:After update trigger to replace an empty string with null updates all the data in that column to null更新触发器后用 null 替换空字符串将该列中的所有数据更新为 null
【发布时间】:2020-06-05 07:52:48
【问题描述】:

我只想更新特定用户的记录。但是更新触发器会为所有用户触发。

CREATE OR REPLACE FUNCTION replace_empty_username_with_null() RETURNS TRIGGER
    LANGUAGE plpgsql AS
BEGIN
    UPDATE user_temp
    SET username=null
    WHERE NEW.id = OLD.id and NEW.username = '';

    RETURN NEW;
END
CREATE TRIGGER replace_empty_username
    AFTER UPDATE OF username ON user_temp
    FOR EACH ROW
    WHEN (NEW.username = '' AND OLD.id = NEW.id)
EXECUTE PROCEDURE replace_empty_username_with_null();

【问题讨论】:

    标签: triggers plpgsql insert-update


    【解决方案1】:

    表达式NEW.id = OLD.id 在触发器的WHEN 子句中有意义(“ID 未更改且不为空”)。但是在触发器 function 的主体中它没有任何意义,它会烧毁到TRUE。此外,要仅影响正在更新的行,只需使用 BEFORE 触发器即可:

    CREATE OR REPLACE FUNCTION replace_empty_username_with_null()
      RETURNS TRIGGER LANGUAGE plpgsql AS
    $func$
    BEGIN
       NEW.username = null;  -- !
       RETURN NEW;
    END
    $func$
    
    CREATE TRIGGER replace_empty_username
    BEFORE UPDATE OF username ON user_temp -- !
    FOR EACH ROW
    WHEN (NEW.username = '' AND OLD.id = NEW.id)
    EXECUTE PROCEDURE replace_empty_username_with_null();
    

    相关:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多