##=====================================================================##
测试环境:
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时对自增列进行数据更新。

##=====================================================================##

MySQL--REPLACE INTO更新自增列值引发的异常的更多相关文章

  1. mysql 清空或删除表数据后,控制表自增列值的方法

    http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html 方法1: truncate table 你的表名 //这样不但将数据全部删除,而且重新定位自增 ...

  2. mysql 深度解析auto-increment自增列"Duliplicate key"问题

    转载自:https://cloud.tencent.com/developer/article/1367681 问题描述 近期,线上有个重要Mysql客户的表在从5.6升级到5.7后master上插入 ...

  3. MySQL -- Innodb是如何处理自增列的

    对于那些向带有自增列的表中插入行的语句,Innodb提供一种可配置的锁定机制,这种锁定机制可以显著提高SQL语句的可伸缩性和性能. Innodb中为了使用自增机制,自增列必须是索引的部份,从而可以使用 ...

  4. mysql获取插入时自增ID值的方法

    1.  LAST_INSERT_ID: LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变. LAST_INSERT_ID是 ...

  5. mysql iot 主键自增列问题

    mysql 如何避免热点块? 主键按sn自增列 Oracle 可以通过翻转索引 比如 插入101 102 103 104 变成101 201 301 401 分散数据 反转索引坏处,无法index r ...

  6. sql server自增列值的获取

    IDENT_CURRENT(tbname) 是看表对象.所以没有受作用域限制. SCOPE_IDENTITY()  受作用域限制.同一个会话里面不同作用域也会有差异 @@IDENTITY  受会话限制 ...

  7. SQL Server 强行Insert包含自增列值的记录

    SET IDENTITY_INSERT 表 ON INSERT INTO 表 ([ID] ,[SequenceNumber] ,[EnumCode] ,[Description]) VALUES ( ...

  8. 转:SqlServer2012自增列值突然增大1000的原因及解决方法

    原文链接:http://blog.csdn.net/phoenix36999/article/details/53304126 首先排除数据回滚及增加删除等操作. 按照这篇文章SQL Server 2 ...

  9. mysql中如何更新一个字段的值为它本身的值连接上一个字符串

    CONCAT(str1,str2,...)     返回结果为连接参数产生的字符串. 如有任何一个参数为NULL ,则返回值为 NULL. 或许有一个或多个参数. 如果所有参数均为非二进制字符串,则结 ...

随机推荐

  1. 20170727xlVBA根据数据表和模板工作簿生成个人明细表工作簿

    Sub CreateTables() Dim Wb As Workbook Dim OpenWb As Workbook Dim Sht As Worksheet Dim Rng As Range D ...

  2. UVA-11882 Biggest Number (DFS+剪枝)

    题目大意:给出一个方格矩阵,矩阵中有数字0~9,任选一个格子为起点,将走过的数字连起来构成一个数,找出最大的那个数,每个格子只能走一次. 题目分析:DFS.剪枝方案:在当前的处境下,找出所有还能到达的 ...

  3. linux下常用的截图、录屏工具

    录屏: 在linux下常用的录屏工具有5种,可以baidu或者google下喔,我选用的是recordMydesktop,使用非常方便,用时注意先把每秒桢数调高,否则效果必然很差. 在ubuntu下可 ...

  4. yum安装docker报 No package docker available错误

    解决方案: yum install epel-release 然后再安装 CentOS6 yum install http://mirrors.yun-idc.com/epel/6/i386/epel ...

  5. 【转载】oracle索引详解2

    原文URL:http://justplayoop1.iteye.com/blog/1259562 一. 索引介绍 1.1  索引的创建 语法 : CREATE UNIUQE | BITMAP INDE ...

  6. 不吹不擂,Python编程【315+道题】

    写在前面 近日恰逢学生毕业季,课程后期大家“期待+苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分[临近毕业每天课前用40-60分钟对之前内容回顾.提问和补充,专挑班里不爱说话就的同学回答]. 期待 ...

  7. ipython与sublime调用其shell出现的问题

    本机电脑 win10 已安装python3.5 1.    直接在命令行运行 pip install ipython[all] 安装 ipython 安装完成后 在命令行输入 jupyter note ...

  8. WordCount:C语言实现

    项目地址:https://github.com/m8705/WordCount 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数. 这个项目要求写一个命令行程序,模仿已 ...

  9. 【python】判断值是否在list和set的对比以及set的实现原理

    判断值是否在set集合中的速度明显要比list快的多, 因为查找set用到了hash,时间在O(1)级别. 假设listA有100w个元素,setA=set(listA)即setA为listA转换之后 ...

  10. ul li列子

    <html> <body> <p>有序列表:</p> <ol> <li>打开冰箱门</li> <li>把 ...