MySQL BIGINT UNSIGNED值超出范围

时间:2018-12-21 08:01:24

标签: mysql

我的数据库中有port,该数据库正在更新统计信息表。该表具有一个multiple triggers列,但是在更新该表时,有时会出现错误:BIGINT UNSIGNED。我想插入的值会导致值小于0,但是在我看来,考虑到语句中的BIGINT UNSIGNED value out of range,这似乎是很奇怪的行为。

我使用的语句:

IF check

引起问题的触发器定义为:

UPDATE TABLE SET FileSize=774982 WHERE ID=10;

如您所见,我仅在FileSize确实发生更改(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不会得到小于0的值。但是,值get超出范围的错误,并且考虑到以下更新语句有效,它似乎不太可能超出IF((Value - OLD.FileSize) < 0, 0, Value - OLD.FileSize)的上限?错误并非总是触发,似乎...?

如您所见,触发器包含两个语句。简单的解释是,第一条语句从统计信息表中删除了旧文件大小,第二条语句向表中添加了新文件大小。 (这将计算差异并正确更新统计信息表)

所以,我不明白如何得到此错误:BIGINT UNSIGNED

新文件大小和旧文件大小分别为Database error: BIGINT UNSIGNED value is out of range in '(DB.Statistics.Value - OLD.FileSize)' (error code: 1690, State: 22003)244662(以字节为单位)

1 个答案:

答案 0 :(得分:3)

当减去UNSIGNED值时,结果也是UNSIGNED,这意味着它不能为负。尝试在Value - OLD.FileSize条件下计算IF()时收到错误消息。

使用减法代替减法。

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