更新触发器用 null 替换空字符串后,将该列中的所有数据更新为 null
After update trigger to replace an empty string with null updates all the data in that column to null
我只想更新特定用户的记录。但是更新触发器会为所有用户触发。
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();
表达式 NEW.id = OLD.id
在触发器的 WHEN
子句中有意义 ("ID did not change and is not null")。但它在触发器 函数 的主体中没有任何意义,它会燃烧到 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();
相关:
- PostgreSQL Update trigger
我只想更新特定用户的记录。但是更新触发器会为所有用户触发。
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();
表达式 NEW.id = OLD.id
在触发器的 WHEN
子句中有意义 ("ID did not change and is not null")。但它在触发器 函数 的主体中没有任何意义,它会燃烧到 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();
相关:
- PostgreSQL Update trigger