更新触发器用 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