mysql 自增id replace_MySQL--REPLACE INTO与自增
##=====================================================================##
測試環(huán)境:
MySQL版本:MySQL 5.7.19
復(fù)制模式:ROW
##=====================================================================##
執(zhí)行下面操作:
##測試腳本:CREATE TABLET_AUTO_TEST
(
IDINT AUTO_INCREMENT PRIMARY KEY,
C1INT NOT NULL,UNIQUE KEYUNI_C1(C1)
)INSERT INTO T_AUTO_TEST(ID,C1)VALUES(99,99);REPLACE INTO T_AUTO_TEST(ID,C1)VALUES(101,99);
##在主庫上和從庫上查看該表當(dāng)前自增值:SELECTTABLE_SCHEMA,TABLE_NAME,AUTO_INCREMENTFROMinformation_schema.tablesWHERE table_name='T_AUTO_TEST';
##發(fā)現(xiàn)主庫上自增值為102,而從庫上為100,當(dāng)主從發(fā)生切換后,正常插入數(shù)據(jù):INSERT INTO T_AUTO_TEST(C1)VALUES(103);INSERT INTO T_AUTO_TEST(C1)VALUES(104);
發(fā)生報錯:
ERROR 1062 (23000): Duplicate entry '101' for key 'PRIMARY'
##=====================================================================##
原因分析:
1、在MySQL中,只有INSERT語句才能導(dǎo)致表的自增ID發(fā)生變化,
2、在主庫上執(zhí)行REPLACE INTO時,由于唯一索引列上存在數(shù)據(jù)沖突,先刪除重復(fù)數(shù)據(jù)再插入新數(shù)據(jù),插入操作導(dǎo)致主庫上表的自增初始值發(fā)生變化。
3、步驟2操作在主庫上執(zhí)行提交后,按照數(shù)據(jù)更新情況,BINLOG中會生成UPDATE類型的日志,UPDATE操作并不觸發(fā)從庫上自增初始值發(fā)生變化。
4、主從發(fā)生變化后,從庫的自增值從100開始增加,當(dāng)增加到102時,當(dāng)前表中已存在102的記錄,因此報主鍵重復(fù)。
##=====================================================================##
總結(jié):
1、REPLACE INTO屬于MySQL特有語法,在使用過程中,應(yīng)避免REPLACE時對自增列進(jìn)行數(shù)據(jù)更新。
##=====================================================================##
總結(jié)
以上是生活随笔為你收集整理的mysql 自增id replace_MySQL--REPLACE INTO与自增的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jar包 jdk 停_一文读懂jar包的
- 下一篇: JAVA入门级教学之(package和i