MySQL--REPLACE INTO與自增

##=====================================================================##
測試環境:
MySQL版本:MySQL 5.7.19
複製模式:ROW
##=====================================================================##測試

執行下面操做:spa

##測試腳本:
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'code

##=====================================================================##
緣由分析:
一、在MySQL中,只有INSERT語句才能致使表的自增ID發生變化,
二、在主庫上執行REPLACE INTO時,因爲惟一索引列上存在數據衝突,先刪除重複數據再插入新數據,插入操做致使主庫上表的自增初始值發生變化。
三、步驟2操做在主庫上執行提交後,按照數據更新狀況,BINLOG中會生成UPDATE類型的日誌,UPDATE操做並不觸發從庫上自增初始值發生變化。
四、主從發生變化後,從庫的自增值從100開始增長,當增長到102時,當前表中已存在102的記錄,所以報主鍵重複。orm

##=====================================================================##blog

總結:索引

一、REPLACE INTO屬於MySQL特有語法,在使用過程當中,應避免REPLACE時對自增列進行數據更新。io

##=====================================================================##table

相關文章
相關標籤/搜索