【问题标题】: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();
相关: