mysql 插入数据失败防止自增长主键增长的方法
2016-12-01 09:21
453 查看
mysql设置了自增长主键ID,插入失败的那个自增长ID也加一的,比如失败5个,下一个成功的不是在原来最后成功数据加1,而是直接变成加6了,失败次数一次就自动增长1了,能不能让失败的不增长的?
或者说mysql插入数据失败,怎么能防止主键增长?
MYSQL不保证AUTO_INCREMENT依次增长(1,2,3,4,5),但是可以保证正向增长(1,3,5,9)所以,当你某次操作失败后,下次AUTO_INCREMENT就不是顺序的了。
innodb的自增是缓存在内存字典中的,分配方式是先预留,然后再插入的。所以插入失败不会回滚内存字典。让innodb识别到当前最大id的方法是重启server 更新AUTO_INCREMENT缓存,或者用alter table `表` AUTO_INCREMENT = 最大数;
这种思路基本不实用,下面介绍一种方便的方法。
Mysql主键如果在insert插入时有值,将不使用自增。也就是说插入数据的时候只要自己把ID加上就按照插入的数进行自增了,这个数通过自己的逻辑判断代码来赋值,只要ID不重复就可以了。例如:
String sql = "insert ignore into mytable(id,number,opendate) values(?,?,?)";
new Object[] {id,number,opendate});
另外一个保证的方法就是每次插入前查询最大ID,然后加1再作为ID插入。
当然还有通过临时表的方式来保证最终插入的都是成功的,不过比较麻烦了。
或者说mysql插入数据失败,怎么能防止主键增长?
MYSQL不保证AUTO_INCREMENT依次增长(1,2,3,4,5),但是可以保证正向增长(1,3,5,9)所以,当你某次操作失败后,下次AUTO_INCREMENT就不是顺序的了。
innodb的自增是缓存在内存字典中的,分配方式是先预留,然后再插入的。所以插入失败不会回滚内存字典。让innodb识别到当前最大id的方法是重启server 更新AUTO_INCREMENT缓存,或者用alter table `表` AUTO_INCREMENT = 最大数;
这种思路基本不实用,下面介绍一种方便的方法。
Mysql主键如果在insert插入时有值,将不使用自增。也就是说插入数据的时候只要自己把ID加上就按照插入的数进行自增了,这个数通过自己的逻辑判断代码来赋值,只要ID不重复就可以了。例如:
String sql = "insert ignore into mytable(id,number,opendate) values(?,?,?)";
new Object[] {id,number,opendate});
另外一个保证的方法就是每次插入前查询最大ID,然后加1再作为ID插入。
当然还有通过临时表的方式来保证最终插入的都是成功的,不过比较麻烦了。
相关文章推荐
- mysql 插入数据失败防止自增长主键增长的方法
- mysql 插入数据失败防止自增长主键增长的方法
- mysql 插入数据失败防止自增长主键增长的方法
- mysql 插入数据失败防止自增长主键增长的方法
- 当插入数据失败时,防止mysql自增长字段的自增长的方法
- mysql 主键id自增长,插入数据的方法
- MySQL防止重复插入唯一限制的数据 4种方法
- MySQL防止重复插入唯一限制的数据 4种方法
- C#中使用MySqlCommand执行插入语句后获取该数据主键id值的方法
- MySQL防止重复插入唯一限制的数据 4种方法
- mysql防止数据重复插入方法分析
- hibernate向mysql插入数据后,得到该条数据主键的方法
- hibernate向mysql插入数据后,得到该条数据主键的方法
- DataFactory往Mysql插入数据失败解决方法
- MySQL数据表中有自增长主键时如何插入数据
- hibernate向mysql插入数据后,得到该条数据主键的方法
- Mysql如何指定新插入的数据的起始自增主键id
- SQLServer中获得刚插入数据中主键值的方法
- mysql 防止重复插入数据
- ibatis获取主键自动增长ID(Oracle/MSSQL/mysql),取得刚插入的ID编号