mysql bigint unsigned value超出范围

4sup72z8  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(375)

我有 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 分别(字节)

l2osamch

l2osamch1#

当你减去 UNSIGNED 值,结果也是 UNSIGNED ,这意味着它不能是负的。当你试图计算的时候,你得到了错误 Value - OLD.FileSizeIF() 条件。
用比较代替减法。

INSERT INTO Statistics VALUES('FileSize', 0, 0, 0) 
    ON DUPLICATE KEY UPDATE Value = IF(Value < OLD.FileSize, 0, Value - OLD.FileSize);

相关问题