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插入。
當然還有通過臨時表的方式來保證最終插入的都是成功的,不過比較麻煩了。