MySQL自增主鍵重複問題的可能

MySQL支持數據字段自增,可以用來作爲數據表的主鍵字段。

自增字段的定義和題外話

看一個數據表的創建實例:

DROP TABLE IF EXISTS `spgl_dfxmsplcxxb`;
CREATE TABLE `spgl_dfxmsplcxxb` (
  `LSH` int(11) NOT NULL AUTO_INCREMENT COMMENT '流水號',
  `DFSJZJ` varchar(50) NOT NULL COMMENT '地方數據主鍵',
  `XZQHDM` varchar(6) NOT NULL COMMENT '行政區劃代碼',
  `SPLCBM` varchar(100) NOT NULL COMMENT '審批流程編碼',
  `SPLCMC` varchar(200) NOT NULL COMMENT '審批流程名稱',
  `SPLCBBH` double(4,1) NOT NULL COMMENT '審批流程版本號',
  `SPLCSXSJ` datetime NOT NULL COMMENT '審批流程生效時間',
  `SPLCLX` int(11) NOT NULL COMMENT '審批流程類型',
  `SPLCSM` varchar(2000) DEFAULT NULL COMMENT 'SPLCSM',
  `FJMC` varchar(512) NOT NULL COMMENT '附件名稱',
  `FJLX` varchar(64) NOT NULL COMMENT '附件類型',
  `FJID` varchar(100) NOT NULL COMMENT '附件ID',
  `SJYXBS` int(11) NOT NULL COMMENT '數據有效標識',
  `SJWXYY` varchar(200) DEFAULT NULL COMMENT '數據無效原因',
  `SJSCZT` int(11) NOT NULL COMMENT '數據上傳狀態',
  `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:地方項目審批流程信息表';

該表將LSH字段設置爲自增主鍵,並默認auto_increment_increment=1、auto_increment_offset=1。
對該表執行show create table spgl_dfxmsplcxxb可以得到如下信息:

CREATE TABLE `spgl_dfxmsplcjdxxb` (
  `LSH` int(11) NOT NULL AUTO_INCREMENT COMMENT '流水號',
  `DFSJZJ` varchar(50) NOT NULL COMMENT '地方數據主鍵',
  `XZQHDM` varchar(6) NOT NULL COMMENT '行政區劃代碼',
  `SPLCBM` varchar(100) NOT NULL COMMENT '審批流程編碼',
  `SPLCBBH` double(4,1) NOT NULL COMMENT '審批流程版本號',
  `SPJDBM` varchar(100) DEFAULT NULL COMMENT '審批階段編碼',
  `SPJDMC` varchar(200) NOT NULL COMMENT '審批階段名稱',
  `SPJDXH` int(11) NOT NULL COMMENT '審批階段序號',
  `DYBZSPJDXH` varchar(200) NOT NULL COMMENT '對應標準審批階段序號',
  `SPJDSX` int(11) NOT NULL COMMENT '審批階段時限',
  `LCBSXLX` int(11) NOT NULL COMMENT '里程碑事項類型',
  `SJYXBS` int(11) NOT NULL COMMENT '數據有效標識',
  `SJWXYY` varchar(200) DEFAULT NULL COMMENT '數據無效原因',
  `SJSCZT` int(11) NOT NULL COMMENT '數據上傳狀態',
  `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:地方項目審批流程階段信息表'

自增字段重複問題

對於表的記錄間互相拷貝問題很容易造成自增字段的重複。例如在我經歷的一次項目:本地數據庫和前置數據庫進行數據同步時,本地庫向前置庫上傳數據,前置庫插入傳來的數據並返回自增字段流水號更本地庫。同步每3分種依據標誌位檢查執行一次。這樣,如果對本地庫數據進行多次修改,那麼就需要向前置庫多次上傳該條記錄(或該條記錄的拷貝記錄)。如果沒有在上傳前手動將前置庫返回的流水號置爲空,那麼前置庫將會用這個已有的流水號作爲主鍵插入新數據(而不是重新生成新的流水號),從而導致主鍵重複的錯誤。
所以,在處理含有自增字段的表格時,如果自增字段和其他表格有數據上的關聯,應當注意這種操作會不會導致自增字段的衝突。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章