【问题标题】:Updating an unsigned INT fails with low values on MySQL更新无符号 INT 失败,MySQL 上的值较低
【发布时间】:2018-08-06 18:29:56
【问题描述】:

我有一个包含复合主键 (a, b) 的表,我想使用 INSERT...ON DUPLICATE KEY UPDATE 语法更新多个列。

INSERT INTO table_a (a, b, c, d, e) VALUES (1533571200, 1, 7, 1, -1) 
ON DUPLICATE KEY UPDATE  c = c + 7, d = d + 1, e = e - 1;

这对所有列都非常有效,除了具有 UNSIGNED 值的列(列 e)。

既然等式 e - 1 总是产生一个大于 0 且小于 100 的数字,那么查询执行是否有可能独立于 DUPLICATE KEY 检查尝试 INSERT 语句?

如果是,是否有一些文档专门解决了这个问题或提供了一些相关的理由?

【问题讨论】:

  • equation e + -1 是什么?又怎么总是大于 0?
  • is working perfectly 那么错误是什么?
  • 错误是 1264 Out of range value for column 'e'
  • 通过完美工作,我的意思是这仅限于本专栏
  • 鉴于表中的数据和我正在尝试的语句,方程 e + -1 始终大于 0

标签: mysql unsigned-integer on-duplicate-key


【解决方案1】:

INSERTINSERT ... ON DUPLICATE KEY UPDATE ... 形式实际上尝试插入操作。只有当插入遇到重复键时,它才会切换到UPDATE

人们可能会认为查询规划器可以在不尝试插入的情况下以某种方式检测到重复键。但在所有情况下,它都不会,而且确实可能​​不会。

可以想象一个INSERT ... ON ERROR UPDATE ... 声明。但这种说法并不存在。

这就解释了为什么INSERT 中的数据类型转换错误会导致整个查询失败。

【讨论】:

  • 我认为查询计划器可以在抛出错误之前检测到重复键。禁用 strict_mode 允许更新发生并且错误被淡化为警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 2018-10-16
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多