##=====================================================================##
測試環境:
MySQL版本:MySQL 5.7.19
復制模式:ROW
##=====================================================================##
執行下面操作:
##測試腳本: CREATE TABLE T_AUTO_TEST ( ID INT AUTO_INCREMENT PRIMARY KEY, C1 INT NOT NULL, UNIQUE KEY UNI_C1(C1) ) INSERT INTO T_AUTO_TEST(ID,C1)VALUES(99,99); REPLACE INTO T_AUTO_TEST(ID,C1)VALUES(101,99); ##在主庫上和從庫上查看該表當前自增值: SELECT TABLE_SCHEMA,TABLE_NAME,AUTO_INCREMENT FROM information_schema.tables WHERE table_name='T_AUTO_TEST'; ##發現主庫上自增值為102,而從庫上為100,當主從發生切換后,正常插入數據: INSERT INTO T_AUTO_TEST(C1)VALUES(103); INSERT INTO T_AUTO_TEST(C1)VALUES(104);
發生報錯:
ERROR 1062 (23000): Duplicate entry '101' for key 'PRIMARY'
##=====================================================================##
原因分析:
1、在MySQL中,只有INSERT語句才能導致表的自增ID發生變化,
2、在主庫上執行REPLACE INTO時,由於唯一索引列上存在數據沖突,先刪除重復數據再插入新數據,插入操作導致主庫上表的自增初始值發生變化。
3、步驟2操作在主庫上執行提交后,按照數據更新情況,BINLOG中會生成UPDATE類型的日志,UPDATE操作並不觸發從庫上自增初始值發生變化。
4、主從發生變化后,從庫的自增值從100開始增加,當增加到102時,當前表中已存在102的記錄,因此報主鍵重復。
##=====================================================================##
總結:
1、REPLACE INTO屬於MySQL特有語法,在使用過程中,應避免REPLACE時對自增列進行數據更新。
##=====================================================================##