【问题标题】:How to wrap int column around instead of overflow如何包装int列而不是溢出
【发布时间】: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 的数量?

标签: mysql integer-overflow


【解决方案1】:

update mytable set intcolumn CASE intcolumn WHEN 4294967295 then 0

【讨论】:

  • 这仅在我添加 1 时回答问题。它不适用于要添加的其他值。
  • 同样的想法update mytable set intcolumn CASE intcolumn WHEN < 4294967295 - valuetoadd then intcolumn + valuetoadd WHEN > 4294967295 - valuetoadd then 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
相关资源
最近更新 更多