我有一个包含3列的表,即数字(自动增量),名称(varchar),id(int)。问题是当我做INSERT IGNORE INTO table1 (name, id) SELECT name, id FROM table2 WHERE id = someid
并忽略时,增量仍然会增加。有没有办法在忽略条目时如何防止增量(当然是重复的)。
答案 0 :(得分:2)
MySQL确定您的语句将插入多少行。然后它预先预先分配自动增量值。这可以防止多个并发语句交错自动增量值。
如果分配了一个号码,则无法再次使用。这就是你的auto_increment值之间存在差距的原因。
你应该重写你的查询,这样它就不一定要依赖auto_increment值。依赖auto_increment值绝不是一个好主意。
或者执行以下操作:
从版本5.1开始,InnoDB具有可配置的自动增量锁定功能。
innodb_autoinc_lock_mode=0 (“traditional” lock mode)
此锁定模式提供与以前相同的行为 innodb_autoinc_lock_mode存在。对于所有“INSERT-like”语句,a 获得特殊的表级AUTO-INC锁并保持到最后 该声明。这确保了由...指定的自动增量值 任何给定的陈述都是连续的。
Configurable InnoDB Auto-Increment Locking
在MySQL运行时无法更改innodb_autoinc_lock_mode。
您必须将其设置为服务器启动选项
--innodb_autoinc_lock_mode=0
或在配置文件(my.ini)
中innodb_autoinc_lock_mode=0
答案 1 :(得分:0)
我已将表格引擎更改为MyISAM
并在我的选项文件中将concurrent_insert
设置为NEVER
,从而解决了我的问题。