提问人:Ryan Peschel 提问时间:4/27/2023 更新时间:4/27/2023 访问量:139
对于Postgres中的非空列,IS DISTINCT FROM vs NOT EQUAL?
IS DISTINCT FROM vs NOT EQUAL for non-null columns in Postgres?
问:
我正在定义一个类似于此答案中发布的代码的触发器。
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 列。email
username
password
据我所知,当列可为 null 时,您会使用,但就我而言,所有这些值都是 .IS DISTINCT FROM
NOT NULL
在这种情况下,使用 仍然正确还是应该这样?IS DISTINCT FROM
WHEN (OLD.email != NEW.email
OR OLD.username != NEW.username
OR OLD.password != NEW.password)
我想后者不仅更正确,而且更快,因为没有执行空检查。这是正确的吗?
答:
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 的),它们的行为方式相同。<>
评论