mysql修改自增主鍵數(shù)值無(wú)效的問(wèn)題及解決
mysql修改自增主鍵數(shù)值無(wú)效
假如你的數(shù)據(jù)表中的數(shù)據(jù)如下圖所示:
把自增主鍵的數(shù)值(AUTO_INCREMENT)設(shè)置為小于等于100的值(以數(shù)值50舉例),我們可以看到mysql顯示修改成功
此時(shí)再次添加數(shù)據(jù)并查詢(xún)所有數(shù)據(jù),發(fā)現(xiàn)主鍵id居然依舊從100開(kāi)始繼續(xù)增長(zhǎng)
查詢(xún)AUTO_INCRMENT數(shù)值發(fā)現(xiàn)數(shù)值為null
因?yàn)楸碇写嬖诒饶阋薷腁UTO_INCREMENT值大的主鍵id,導(dǎo)致無(wú)法把AUTO_INCREMENT修改為50,而且不會(huì)有任何報(bào)錯(cuò),所以不要把AUTO_INCREMENT修改為小于 最大主鍵id 的值
mysql自增主鍵重復(fù)問(wèn)題的可能
MySQL支持?jǐn)?shù)據(jù)字段自增,可以用來(lái)作為數(shù)據(jù)表的主鍵字段。
自增字段的定義和題外話
看一個(gè)數(shù)據(jù)表的創(chuàng)建實(shí)例:
DROP TABLE IF EXISTS `spgl_dfxmsplcxxb`; CREATE TABLE `spgl_dfxmsplcxxb` ( ? `LSH` int(11) NOT NULL AUTO_INCREMENT COMMENT '流水號(hào)', ? `DFSJZJ` varchar(50) NOT NULL COMMENT '地方數(shù)據(jù)主鍵', ? `XZQHDM` varchar(6) NOT NULL COMMENT '行政區(qū)劃代碼', ? `SPLCBM` varchar(100) NOT NULL COMMENT '審批流程編碼', ? `SPLCMC` varchar(200) NOT NULL COMMENT '審批流程名稱(chēng)', ? `SPLCBBH` double(4,1) NOT NULL COMMENT '審批流程版本號(hào)', ? `SPLCSXSJ` datetime NOT NULL COMMENT '審批流程生效時(shí)間', ? `SPLCLX` int(11) NOT NULL COMMENT '審批流程類(lèi)型', ? `SPLCSM` varchar(2000) DEFAULT NULL COMMENT 'SPLCSM', ? `FJMC` varchar(512) NOT NULL COMMENT '附件名稱(chēng)', ? `FJLX` varchar(64) NOT NULL COMMENT '附件類(lèi)型', ? `FJID` varchar(100) NOT NULL COMMENT '附件ID', ? `SJYXBS` int(11) NOT NULL COMMENT '數(shù)據(jù)有效標(biāo)識(shí)', ? `SJWXYY` varchar(200) DEFAULT NULL COMMENT '數(shù)據(jù)無(wú)效原因', ? `SJSCZT` int(11) NOT NULL COMMENT '數(shù)據(jù)上傳狀態(tài)', ? `SBYY` varchar(1000) DEFAULT NULL COMMENT '失敗原因', ? PRIMARY KEY (`LSH`), ? KEY `unique_main` (`XZQHDM`,`SPLCBM`,`SPLCBBH`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COMMENT='表1:地方項(xiàng)目審批流程信息表';
該表將LSH字段設(shè)置為自增主鍵,并默認(rèn)auto_increment_increment=1、auto_increment_offset=1。
對(duì)該表執(zhí)行show create table spgl_dfxmsplcxxb可以得到如下信息:
CREATE TABLE `spgl_dfxmsplcjdxxb` ( ? `LSH` int(11) NOT NULL AUTO_INCREMENT COMMENT '流水號(hào)', ? `DFSJZJ` varchar(50) NOT NULL COMMENT '地方數(shù)據(jù)主鍵', ? `XZQHDM` varchar(6) NOT NULL COMMENT '行政區(qū)劃代碼', ? `SPLCBM` varchar(100) NOT NULL COMMENT '審批流程編碼', ? `SPLCBBH` double(4,1) NOT NULL COMMENT '審批流程版本號(hào)', ? `SPJDBM` varchar(100) DEFAULT NULL COMMENT '審批階段編碼', ? `SPJDMC` varchar(200) NOT NULL COMMENT '審批階段名稱(chēng)', ? `SPJDXH` int(11) NOT NULL COMMENT '審批階段序號(hào)', ? `DYBZSPJDXH` varchar(200) NOT NULL COMMENT '對(duì)應(yīng)標(biāo)準(zhǔn)審批階段序號(hào)', ? `SPJDSX` int(11) NOT NULL COMMENT '審批階段時(shí)限', ? `LCBSXLX` int(11) NOT NULL COMMENT '里程碑事項(xiàng)類(lèi)型', ? `SJYXBS` int(11) NOT NULL COMMENT '數(shù)據(jù)有效標(biāo)識(shí)', ? `SJWXYY` varchar(200) DEFAULT NULL COMMENT '數(shù)據(jù)無(wú)效原因', ? `SJSCZT` int(11) NOT NULL COMMENT '數(shù)據(jù)上傳狀態(tài)', ? `SBYY` varchar(1000) DEFAULT NULL COMMENT '失敗原因', ? PRIMARY KEY (`LSH`), ? KEY `unique_main` (`XZQHDM`,`SPLCBM`,`SPLCBBH`,`SPJDXH`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='表2:地方項(xiàng)目審批流程階段信息表'
自增字段重復(fù)問(wèn)題
對(duì)于表的記錄間互相拷貝問(wèn)題很容易造成自增字段的重復(fù)。
例如在我經(jīng)歷的一次項(xiàng)目:本地?cái)?shù)據(jù)庫(kù)和前置數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)同步時(shí),本地庫(kù)向前置庫(kù)上傳數(shù)據(jù),前置庫(kù)插入傳來(lái)的數(shù)據(jù)并返回自增字段流水號(hào)更本地庫(kù)。同步每3分種依據(jù)標(biāo)志位檢查執(zhí)行一次。
這樣,如果對(duì)本地庫(kù)數(shù)據(jù)進(jìn)行多次修改,那么就需要向前置庫(kù)多次上傳該條記錄(或該條記錄的拷貝記錄)。
如果沒(méi)有在上傳前手動(dòng)將前置庫(kù)返回的流水號(hào)置為空,那么前置庫(kù)將會(huì)用這個(gè)已有的流水號(hào)作為主鍵插入新數(shù)據(jù)(而不是重新生成新的流水號(hào)),從而導(dǎo)致主鍵重復(fù)的錯(cuò)誤。
所以,在處理含有自增字段的表格時(shí),如果自增字段和其他表格有數(shù)據(jù)上的關(guān)聯(lián),應(yīng)當(dāng)注意這種操作會(huì)不會(huì)導(dǎo)致自增字段的沖突。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決MySQL Sending data導(dǎo)致查詢(xún)很慢問(wèn)題的方法與思路
這篇文章主要介紹了解決MySQL Sending data導(dǎo)致查詢(xún)很慢問(wèn)題的方法與思路,感興趣的小伙伴們可以參考一下2016-04-04MySQL刪除外鍵時(shí)報(bào)錯(cuò)Error?Code:1091.?Can‘t?DROP?‘XXX‘的解決方法
這篇文章主要給大家介紹了關(guān)于MySQL刪除外鍵時(shí)報(bào)錯(cuò)Error?Code:1091.?Can‘t?DROP?‘XXX‘的解決方法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-08-08面試被問(wèn)select......for update會(huì)鎖表還是鎖行
select … for update 是我們常用的對(duì)行加鎖的一種方式,那么select......for update會(huì)鎖表還是鎖行,本文就詳細(xì)的來(lái)介紹一下,感興趣的可以了解一下2021-11-11Mysql桌面工具之SQLyog資源及激活使用方法告別黑白命令行
這篇文章主要介紹了Mysql桌面工具之SQLyog資源及激活使用方法告別黑白命令行,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02