我有 multiple triggers
我的数据库正在更新一个统计表。这张table有一张table BIGINT UNSIGNED
列,但在更新表时,有时会发现错误: BIGINT UNSIGNED value out of range
. 我猜被插入的值会导致一个小于0的值,但是在我看来,考虑到 IF check
在我的陈述中。
我使用的语句:
UPDATE TABLE SET FileSize=774982 WHERE ID=10;
引发问题的触发器定义为:
IF (OLD.FileSize <> NEW.FileSize) THEN
INSERT INTO Statistics VALUES('FileSize', 0, 0, 0)
ON DUPLICATE KEY UPDATE Value = IF((Value - OLD.FileSize) < 0, 0, Value - OLD.FileSize);
INSERT INTO Statistics VALUES('FileSize', 0, 0, NEW.FileSize)
ON DUPLICATE KEY UPDATE Value = Value + NEW.FileSize;
END IF
如您所见,我仅在文件大小确实发生更改时才更新统计表( OLD.FileSize <> NEW.FileSize
). 此外,我还添加了一个检查,以确保使用 IF((Value - OLD.FileSize) < 0, 0, Value - OLD.FileSize)
. 不过,get的值是一个超出范围的错误,它似乎不太可能超出 BIGINT UNSIGNED
,假设下面的update语句有效?这个错误并不总是被触发的,好像。。。?
如您所见,触发器由两个语句组成。简单的解释是,第一条语句从统计表中删除旧的文件大小,第二条语句向表中添加新的文件大小(这将计算差异并正确更新统计表)
所以,我不明白我怎么能得到这个错误: Database error: BIGINT UNSIGNED value is out of range in '(DB.Statistics.Value - OLD.FileSize)' (error code: 1690, State: 22003)
新旧文件大小相同 244662
以及 774982
分别(字节)
1条答案
按热度按时间l2osamch1#
当你减去
UNSIGNED
值,结果也是UNSIGNED
,这意味着它不能是负的。当你试图计算的时候,你得到了错误Value - OLD.FileSize
在IF()
条件。用比较代替减法。