概述
很多時候我們想要對MySQL的一張普通表,修改為自增表,可以考慮怎么做呢?

修改普通表為自增表
將普通表修改為自增表,可分為兩種類型:
1、將現有列修改為自增列
當數據類型為數值類型且表中數據唯一時,直接只用ALTER TABLE ALTER COLUMN命令進行修改,修改操作會保留現有列中數據。
2、對普通表新增自增列
如果直接使用ALTER TABLE ADD COLUMN來修改,會為每行記錄生成新的自增值,但該操作可能會導致主從數據不一致,不建議使用。
新增自增列引發主從數據不一致
在MySQL中允許使用ALTER TABLE方式為普通表新增一個自增列,但由于ALTER操作為DDL語句,在主從復制時會將該DDL語句傳遞給從庫執行,MySQL并不能保證相同記錄在主從服務器上獲得相同的自增ID,會導致主從數據差異。
模擬測試:
## 主庫上創建表: CREATE TABLE TB1001 ( C1 INT ); ## 會話1開啟事務并執行: START TRANSACTION; INSERT INTO TB1001(C1) SELECT 1; ## 會話2執行: INSERT INTO TB1001(C1) SELECT 2; ## 會話1提交事務。 ## 然后將表修改為自增表: ALTER TABLE TB1001 ADD ID INT PRIMARY KEY AUTO_INCREMENT;
可以發現主庫數據為:

從庫數據為:

原因分析:
在主庫上,C1=2的數據晚于C1=1的數據被插入,但由于C1=2的數據所在事務被先提交,因此C1=2的記錄先于C1=1的記錄在從庫上執行,因此兩條記錄在主庫和從庫上的插入順序不同,在生成自增ID時獲得到自增ID不同,最終導致數據差異。
總結
如果是主從架構,注意在將普通表修改為自增表時,如果表中存在數據,不要使用ALTER TABLE的方式修改,建議新建自增臨時表,然后將數據導入到該表中,再對換表名。