我有这样的表结构
在此处输入图片说明
当我向表中插入行时,我正在使用以下查询:
INSERT INTO table_blah ( material_item, ... hidden ) VALUES ( data, ... data ) ON DUPLICATE KEY UPDATE id = id, material_item = data, ... hidden = data;
当我第一次插入数据而不触发ON DUPLICATE KEYid时,罚款会逐渐增加:
在此处输入图片说明
但是当ON DUPLICATE KEY触发器和我插入新行时,id对我来说很奇怪:
在此处输入图片说明
auto increment即使触发了,我如何正确保持增量ON DUPLICATE KEY呢?
这种行为被记录在案(括号内段):
如果指定ON DUPLICATE KEY UPDATE,并且插入一行会导致UNIQUE索引或PRIMARY KEY中的值重复,则MySQL将对旧行执行UPDATE。例如,如果将列a声明为UNIQUE并包含值1,则以下两个语句具有相似的作用:
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
(对于a是自动递增列的InnoDB表,其效果是不同的。对于自动递增列,INSERT语句会增加自动递增值,但UPDATE不会。)
这是一个简单的解释。MySQL尝试首先执行插入操作。这是ID自动递增的时间。一旦增加,它将保持不变。然后检测到重复项并进行更新。但是价值被错过了。
您不应该依赖于auto_increment没有差距。如果这是必需的,则更新和插入的开销会更大。本质上,您需要在整个表上加一个锁,并通常使用触发器对需要重新编号的所有内容进行重新编号。更好的解决方案是计算输出的增量值。来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。