对于Postgres中的非空列,IS DISTINCT FROM vs NOT EQUAL?

IS DISTINCT FROM vs NOT EQUAL for non-null columns in Postgres?

提问人:Ryan Peschel 提问时间:4/27/2023 更新时间:4/27/2023 访问量:139

问:

我正在定义一个类似于此答案中发布的代码的触发器。

CREATE TRIGGER trigger_update_account_details
AFTER UPDATE ON account_details
FOR EACH ROW
WHEN (OLD.email    IS DISTINCT FROM NEW.email
   OR OLD.username IS DISTINCT FROM NEW.username
   OR OLD.password IS DISTINCT FROM NEW.password) 
EXECUTE FUNCTION notify_insert_account_details();

但是,假设 、 和 不是 NULLABLE 列。emailusernamepassword

据我所知,当列可为 null 时,您会使用,但就我而言,所有这些值都是 .IS DISTINCT FROMNOT NULL

在这种情况下,使用 仍然正确还是应该这样?IS DISTINCT FROM

WHEN (OLD.email    != NEW.email
   OR OLD.username != NEW.username
   OR OLD.password != NEW.password) 

我想后者不仅更正确,而且更快,因为没有执行空检查。这是正确的吗?

SQL PostgreSQL 触发器 null distinct

评论

0赞 Adrian Klaver 4/27/2023
来自文档比较运算符对于非 null 输入,IS DISTINCT FROM 与 <> 运算符相同。但是,如果两个输入都为 null,则返回 false,如果只有一个输入为 null,则返回 true。同样,对于非 null 输入,IS NOT DISTINCT FROM 与 = 相同,但当两个输入均为 null 时,它返回 true,当只有一个输入为 null 时,它返回 false。因此,这些谓词实际上就像 null 是正常的数据值一样,而不是“未知”。所以可能没有区别。测试以确认。

答:

2赞 Mr. Bhosale 4/27/2023 #1

您说得对,对于不可为 null 的列不需要使用 IS DISTINCT FROM,改用 != 运算符会更合适,而且可能更快,因为不需要 null 检查。

因此,您可以将以下代码用于触发器:

CREATE TRIGGER trigger_update_account_details
AFTER UPDATE ON account_details
FOR EACH ROW
WHEN (OLD.email != NEW.email
OR OLD.username != NEW.username
OR OLD.password != NEW.password)
EXECUTE FUNCTION notify_insert_account_details();

这将确保仅在电子邮件、用户名或密码值实际更新时触发触发器。

评论

0赞 The Impaler 4/28/2023
IS DISTINCT FROM是 的概括。在这种特殊情况下(所有列都是不可为 null 的),它们的行为方式相同。<>