日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql自增字段不连续_MySQL中自增主键不连续之解决方案。(20131109)

發(fā)布時間:2025/3/21 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql自增字段不连续_MySQL中自增主键不连续之解决方案。(20131109) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

該樓層疑似違規(guī)已被系統(tǒng)折疊?隱藏此樓查看此樓

今天只做了一件事情,但解決了很大的問題。相信這也是令很多程序員和數(shù)據(jù)庫管理員頭疼的事情。

假設在一MySQL數(shù)據(jù)表中,自增的字段為id,唯一字段為abc,還有其它字段若干。

自增:AUTO_INCREMENT

A、使用insert into插入數(shù)據(jù)時,若abc的值已存在,因其為唯一鍵,故不會插入成功。但此時,那個AUTO_INCREMENT已然+1了。

eg : insert into `table` set `abc` = '123'

B、使用replace插入數(shù)據(jù)時,若abc的值已存在,則會先刪除表中的那條記錄,爾后插入新數(shù)據(jù)。

eg : replace into `table` set `abc` = '123'

(注:上一行中的into可省略;這只是一種寫法。)

這兩種方法,效果都不好:A會造成id不連續(xù),B會使得原來abc對應的id值發(fā)生改變,而這個id值會和其它表進行關(guān)聯(lián),這是更不允許的。

那么,有沒有解決方案呢?

笨辦法當然是有:每次插入前先查詢,若表中不存在要插入的abc的值,才插入。

但這樣,每次入庫之前都會多一個操作,麻煩至極。

向同學請教,說用觸發(fā)器。可在網(wǎng)上找了半天,總是有問題。可能是語法不對,或者是某些東西有限制。

其實,最終要做的,就是在每次插入數(shù)據(jù)之后,修正那個AUTO_INCREMENT值。

于是就想到,把這個最實質(zhì)的SQL語句↓,合并在插入的SQL中。

PS:

ALTER TABLE `table` AUTO_INCREMENT =1

執(zhí)行之后,不一定再插入的id就是1;而是表中id最大值+1。

這是MySQL中的執(zhí)行結(jié)果。其它數(shù)據(jù)庫不清楚。。。。

到這里,問題就變的異常簡單了:在每次插入之后都重置AUTO_INCREMENT的值。

如果插入的自定義函數(shù)或類的名稱被定義成insert的話,那么就在此基礎上擴展一個函數(shù)insert_continuous_id好了,其意為:保證自增主鍵連續(xù)的插入。

為什么不直接修改原函數(shù)呢?

這是因為,并不是所有的insert都需要修正AUTO_INCREMENT。只有在設置唯一鍵、且有自增主鍵時才有可能需要。

雖然重置不會有任何的副作用(經(jīng)試驗,對各種情況都無影響),但沒有必要就不要額外增加這一步。

一個優(yōu)秀的程序員,就是要盡量保證寫出的每一個字符都有意義而不多余。

啰啰嗦嗦的說了這么多,其實只有一句話:解決MySQL中自增主鍵不連續(xù)的方法,就是上面PS下的那一行代碼。

附:

我寫的不成功的觸發(fā)器的代碼。

-- 觸發(fā)器

CREATE TRIGGER trigger_table after insert

ON table FOR EACH ROW

ALTER TABLE `table` AUTO_INCREMENT =1;

大家有想說的,請踴躍發(fā)言。期待更好更完美的解決方案。

總結(jié)

以上是生活随笔為你收集整理的mysql自增字段不连续_MySQL中自增主键不连续之解决方案。(20131109)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。