我有这样的表结构

当我向表中插入行时,我正在使用此查询:
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?
Gor*_*off 40
记录此行为:
如果指定ON DUPLICATE KEY UPDATE,并且插入的行将导致UNIQUE索引或PRIMARY KEY中出现重复值,则MySQL将执行旧行的UPDATE.例如,如果列a声明为UNIQUE并包含值1,则以下两个语句具有类似的效果:
Run Code Online (Sandbox Code Playgroud)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;(对于一个自动增量列的InnoDB表,效果并不相同.对于自动增量列,INSERT语句会增加自动增量值,但UPDATE不会.)
这是一个简单的解释.MySQL首先尝试进行插入.这是id自动递增的时候.一旦增加,它就会停留.然后检测到副本并进行更新.但是这个价值被遗漏了.
你不应该依赖于auto_increment没有差距.如果这是一项要求,则更新和插入的开销要大得多.实质上,您需要锁定整个表,并重新编号需要重新编号的所有内容,通常使用触发器.更好的解决方案是计算输出的增量值.
小智 9
这个问题是一个相当老的问题,但我回答它也许可以帮助某人,解决自动递增问题,在插入/重复更新部分之前使用以下代码并一起执行它们:
SET @NEW_AI = (SELECT MAX(`the_id`)+1 FROM `table_blah`);
SET @ALTER_SQL = CONCAT('ALTER TABLE `table_blah` AUTO_INCREMENT =', @NEW_AI);
PREPARE NEWSQL FROM @ALTER_SQL;
EXECUTE NEWSQL;
Run Code Online (Sandbox Code Playgroud)
放在一起并在一份声明中应该如下所示:
SET @NEW_AI = (SELECT MAX(`the_id`)+1 FROM `table_blah`);
SET @ALTER_SQL = CONCAT('ALTER TABLE `table_blah` AUTO_INCREMENT =', @NEW_AI);
PREPARE NEWSQL FROM @ALTER_SQL;
EXECUTE NEWSQL;
INSERT INTO `table_blah` (`the_col`) VALUES("the_value")
ON DUPLICATE KEY UPDATE `the_col` = "the_value";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30384 次 |
| 最近记录: |