You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Derby BEFORE触发器中CURRENT_TIMESTAMP运行时异常求助

Apache Derby触发器时间戳赋值问题解决方案

核心问题

你在触发器中误用了VALUES关键字来修改NEW行的列值,这是导致插入时无赋值、更新时类型转换错误的根本原因。Derby的BEFORE触发器需要使用SET关键字来更新新行(NEW)的列值,而非VALUES。

错误原因解析

  1. INSERT触发器无赋值:VALUES NEW.MODIFYTIME = CURRENT_TIMESTAMP的写法不符合Derby语法,Derby无法识别该语句为修改NEW行的操作,因此MODIFYTIME列未被赋值,也无报错(该语句被当作无效的VALUES表达式处理)。
  2. UPDATE触发器类型转换错误:同样误用VALUES后,Derby会将NEW.STATUS = 9这类赋值表达式解析为布尔值,再尝试将其转换为对应列的类型(NUMERIC/TIMESTAMP),从而触发尝试从TIMESTAMP类型的数据值获取long类型的数据值的错误。

修正后的触发器代码

插入触发器

CREATE TRIGGER TEST1_BINS_TRG1
NO CASCADE BEFORE INSERT ON TEST1
REFERENCING NEW AS NEW
FOR EACH ROW MODE DB2SQL
SET NEW.MODIFYTIME = CURRENT_TIMESTAMP;

更新触发器

CREATE TRIGGER TEST1_BUPD_TRG1
NO CASCADE BEFORE UPDATE OF STATUS
ON TEST1
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW MODE DB2SQL
WHEN ( NEW.STATUS >= 0 AND OLD.STATUS <> 9 )
SET NEW.STATUS = 9, 
    NEW.MODIFYTIME = CURRENT_TIMESTAMP, 
    NEW.ENDTIME = CURRENT_TIMESTAMP;

验证说明

修正后执行测试语句:

  • 插入语句INSERT INTO DMKASL.TEST1 (UNIQUE_ID) VALUES ('1')会自动为MODIFYTIME赋值当前时间戳;
  • 更新语句UPDATE DMKASL.TEST1 SET STATUS=1 WHERE UNIQUE_ID='1'会触发触发器,将STATUS设为9,同时更新MODIFYTIME和ENDTIME为当前时间戳,无类型转换错误。

内容的提问来源于stack exchange,提问作者Steven S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:43:13