更新触发器将空字符串替换为null后,将该列中的所有数据更新为null

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

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

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个回答
0
投票

表达式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();

相关:

© www.soinside.com 2019 - 2024. All rights reserved.