【发布时间】:2017-08-01 15:25:21
【问题描述】:
我在触发器中有这段代码:
CREATE TRIGGER customernametrig
AFTER UPDATE
ON customers
FOR EACH ROW
EXECUTE PROCEDURE trig();
和功能:
CREATE OR REPLACE FUNCTION trig()
RETURNS trigger AS
$BODY$
begin
if TG_OP='UPDATE' then
RAISE NOTICE '%', new.customername;
RAISE NOTICE '%', old.customername;
RAISE NOTICE '%', new.customername<>old.customername;
if new.customername<>old.customername then
RAISE NOTICE 'hi';
end if;
end if;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
customername 列的类型为 citext。
当我运行更新命令时
Update customers set customername='Jack' where customerid=125;
它打印的字段:
NOTICE: Jack
NOTICE: jack
NOTICE: f
但如果我运行select 'jack'<>'Jack',它会给我:t
所以我期望它打印的是:
NOTICE: Jack
NOTICE: jack
NOTICE: t
NOTICE: hi
我不明白这种行为。这里发生了什么?
【问题讨论】:
-
您可能对
NULLs 感到困惑,可能应该使用is distinct from而不是<>。 -
@GordonLinoff 这里没有空值。我在询问 Jack 与 jack 的这个特定比较:“对于非空输入,IS DISTINCT FROM 与 运算符相同。” postgresql.org/docs/9.0/static/functions-comparison.html
-
出于好奇,添加 BEFORE UPDATE 触发器并检查是否相同?..
-
@VaoTsun 该表有 25 列,其中大部分为空。我为我的支票创建了一个“细长”行,这也发生在这一行中。基本上我只有客户ID和客户名称。所以你可以创建 customerid integer , customername citext。
-
citext不区分大小写 - 所以它的预期结果 - 我觉得有这样的东西 - 所以设置为 'Vao' 应该 RAISEhi
标签: sql postgresql plpgsql database-trigger