mysql自增字段不连续_MySQL中自增主键不连续之解决方案。(20131109)
該樓層疑似違規已被系統折疊?隱藏此樓查看此樓
今天只做了一件事情,但解決了很大的問題。相信這也是令很多程序員和數據庫管理員頭疼的事情。
假設在一MySQL數據表中,自增的字段為id,唯一字段為abc,還有其它字段若干。
自增:AUTO_INCREMENT
A、使用insert into插入數據時,若abc的值已存在,因其為唯一鍵,故不會插入成功。但此時,那個AUTO_INCREMENT已然+1了。
eg : insert into `table` set `abc` = '123'
B、使用replace插入數據時,若abc的值已存在,則會先刪除表中的那條記錄,爾后插入新數據。
eg : replace into `table` set `abc` = '123'
(注:上一行中的into可省略;這只是一種寫法。)
這兩種方法,效果都不好:A會造成id不連續,B會使得原來abc對應的id值發生改變,而這個id值會和其它表進行關聯,這是更不允許的。
那么,有沒有解決方案呢?
笨辦法當然是有:每次插入前先查詢,若表中不存在要插入的abc的值,才插入。
但這樣,每次入庫之前都會多一個操作,麻煩至極。
向同學請教,說用觸發器。可在網上找了半天,總是有問題??赡苁钦Z法不對,或者是某些東西有限制。
其實,最終要做的,就是在每次插入數據之后,修正那個AUTO_INCREMENT值。
于是就想到,把這個最實質的SQL語句↓,合并在插入的SQL中。
PS:
ALTER TABLE `table` AUTO_INCREMENT =1
執行之后,不一定再插入的id就是1;而是表中id最大值+1。
這是MySQL中的執行結果。其它數據庫不清楚。。。。
到這里,問題就變的異常簡單了:在每次插入之后都重置AUTO_INCREMENT的值。
如果插入的自定義函數或類的名稱被定義成insert的話,那么就在此基礎上擴展一個函數insert_continuous_id好了,其意為:保證自增主鍵連續的插入。
為什么不直接修改原函數呢?
這是因為,并不是所有的insert都需要修正AUTO_INCREMENT。只有在設置唯一鍵、且有自增主鍵時才有可能需要。
雖然重置不會有任何的副作用(經試驗,對各種情況都無影響),但沒有必要就不要額外增加這一步。
一個優秀的程序員,就是要盡量保證寫出的每一個字符都有意義而不多余。
啰啰嗦嗦的說了這么多,其實只有一句話:解決MySQL中自增主鍵不連續的方法,就是上面PS下的那一行代碼。
附:
我寫的不成功的觸發器的代碼。
-- 觸發器
CREATE TRIGGER trigger_table after insert
ON table FOR EACH ROW
ALTER TABLE `table` AUTO_INCREMENT =1;
大家有想說的,請踴躍發言。期待更好更完美的解決方案。
總結
以上是生活随笔為你收集整理的mysql自增字段不连续_MySQL中自增主键不连续之解决方案。(20131109)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql语言的简介_谁能帮我介绍一下
- 下一篇: mysql连接编程环境_C++连接MyS