繁体   English   中英

为什么 postgresql 认为记录是 null 而它显然不是?

[英]why does postgresql think the record is null while its clearly not?

我有一个包含一行的表的更新触发器,我有一个名为RFID的列。 触发器应该在该行上触发AFTER UPDATE并告诉我该列的值是否已更改。 问题是,它认为记录 OLD 和 NEW 是 null,而它们显然不是。 我稍微更改了 function 代码,只是为了突出我的问题。 这是 function 和触发代码。

    CREATE FUNCTION General_Update() RETURNS TRIGGER LANGUAGE plpgsql AS $BODY$
    DECLARE 
       data TEXT;
       BEGIN
           IF NEW."RFID" IS NULL THEN
               RAISE EXCEPTION 'RFID cannot be null';
           ELSEIF (OLD."RFID" IS DISTINCT FROM NEW."RFID") THEN
               data = 'changed';
           ELSE data = ' unchanged';
           END IF;
           PERFORM pg_notify('samme3a', data);
           RETURN NEW;
       END
       $BODY$;


       CREATE TRIGGER General_Trigger
       AFTER UPDATE ON "OPC1Data" 
       EXECUTE FUNCTION General_Update()

每次我尝试更新时都会触发异常“RFID 不能为空”。

如果您想要new old记录,则需要FOR EACH ROW触发器。

CREATE TRIGGER general_trigger
               AFTER UPDATE
                     ON "OPC1Data" 
                     FOR EACH ROW
                     EXECUTE FUNCTION general_update();

还有一些旁注:

  • 我建议不要“隐藏”触发器中"RFID"的实际非 null 约束。 只需在表的CREATE语句中声明列NOT NULL 这样,每个查看表定义的人都会知道"RFID"不可为空,而无需查看触发器。
  • 考虑不要在双引号中使用那些区分大小写的标识符。 它们只会使事情变得比必要的更复杂。 数据库中的标识符不需要看起来“漂亮”。 这是由表示层处理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM