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