【发布时间】:2015-12-17 14:48:31
【问题描述】:
假设有unsigned int 类型的列。由于 4294967295 是最大的无符号整数,因此此查询将失败并出现溢出错误:
update mytable set intcolumn = intcolumn + 1;
我怎样才能做到这一点而不是溢出,4294967295 + 1 将变为 0(零)?
更一般地说,通过添加任何整数,我只希望整数环绕零而不是溢出。
我刚刚发现在mysql 5.5.5之前,整数默默地环绕。只有 5.5.5 及更高版本会抛出错误。
【问题讨论】:
-
update mytable set intcolumn = CASE WHEN intcolumn = 4294967295 THEN 0 ELSE intcolumn + 1 END;不管怎样,你为什么要重新发明自动增量? -
这是一个想法,但还不够笼统。如果我要添加一个任意整数怎么办?
-
那么它会加1。关键是重新发明SEQUENCE/IDENTITY/AUTO_INCREMENT导致的问题多于解决的问题。
-
而且它根本不是自动增量的。如果是这样,环绕零会导致引用不一致。
-
努力想清楚为什么这是必要的。由于您要向其中添加任何整数,因此您可能会查看
TRIGGER来处理此问题。此外,如果您将超过 1 的最大值添加到最大值,您会始终希望它为 0,还是希望新值为 0 + 您添加的大于 1 的数量?