自增列导致主键重复

有记录进行插入时,自增列产生的值就有可能与已有的记录主键冲突,导致出错。首先想办法解决问题,通过人工调大自增列的值,保证大于表内已有的主键即可,调整后,导数据正常

问题发生的前置条件:

1.mysql复制基于row模式

2.innodb表

3.表含有自增主键,并且含有唯一约束

4.load data infile 采用replace into语法插入数据【遇到重复唯一约束,直接覆盖】

问题发生的原理:

1.主库遇到重复unique约束时,进行replace操作;

2.replace在主库上面实际变化为delete+insert,但binlog记录的是update;

3.备库重做update动作,更新主键,但由于update动作不会更新自增列值,导致更新后记录值大于自增列值

问题重现实验:


准备工作


Create table test_autoinc(id int auto_increment, c1 int,c2 varchar(100),primary key(id),unique key(c1));

insert into test_autoinc(c1,c2) values(1,'abc');

insert into test_autoinc(c1,c2) values(2,'abc');

insert into test_autoinc(c1,c2) values(3,'abcdd');

insert into test_autoinc(c1,c2) values(4,'abcdd');

insert into test_autoinc(c1,c2) values(5,'abcdd');


1


操作


备注


Master


slave


2


查看自增列值

Show create table test_autoinc\G


插入5条记录后,自增列值变为6


CREATE TABLE `test_autoinc` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`c1` int(11) DEFAULT NULL,

`c2` varchar(100) DEFAULT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `c1` (`c1`)

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;


CREATE TABLE `test_autoinc` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`c1` int(11) DEFAULT NULL,

`c2` varchar(100) DEFAULT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `c1` (`c1`)

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8


3


查看表数据


id | c1   | c2

---+------+------

1 |    1 | abc

2 |    2 | abc

3 |    3 | abcdd

4 |    4 | abcdd

5 |    5 | abcdd


id | c1   | c2

---+------+------

1 |    1 | abc

2 |    2 | abc

3 |    3 | abcdd

4 |    4 | abcdd

5 |    5 | abcdd


4


查看binlog位置

show master status\G


记录当前binlog位点,

后续可以查看replace动作产生的binlog事件


mysql-bin.000038

59242888


5


replace操作

replace into test_autoinc(c1,c2) values(2,'eeee');


影响两条记录,主库replace=

delete+insert


Query OK, 2 rows affected

(0.00 sec)


6


查看表数据


id | c1   | c2

---+------+-------

1 |    1 | abc

3 |    3 | abcdd

4 |    4 | abcdd

5 |    5 | abcdd

6 |    2 | eeee


id | c1   | c2

---+------+-------

1 |    1 | abc

3 |    3 | abcdd

4 |    4 | abcdd

5 |    5 | abcdd

6 |    2 | eeee


7


查看binlog事件

show binlog events in 'mysql-bin.000038' from 59242888;


也可以通过mysqlbinlog工具分析日志,查询从库执行的update语句


Pos      | Event_type

---------+---------------

59242888 | Query

59242957 | Table_map

59243013 |Update_rows_v1

59243072 | Xid


8


查看自增列值

Show create table  test_autoinc\G;


此时master的自增列为7,而slave的自增列为6,与表内最大值相同


CREATE TABLE `test_autoinc` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`c1` int(11) DEFAULT NULL,

`c2` varchar(100) DEFAULT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `c1` (`c1`)

) ENGINE=InnoDBAUTO_INCREMENT=7


CREATE TABLE `test_autoinc` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`c1` int(11) DEFAULT NULL,

`c2` varchar(100) DEFAULT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `c1` (`c1`)

) ENGINE=InnoDBAUTO_INCREMENT=6

9 手工调大自增主键 Show create table  test_autoinc\G;
手工调大自增id

alter table test_autoinc auto_increment=12;


Show create table  test_autoinc\G;


alter table test_autoinc auto_increment=12;

Show create table  test_autoinc\G;

发现master和slave的自增id一致

原文地址:http://blog.51cto.com/9615915/2070223

时间: 2024-10-11 10:38:44

自增列导致主键重复的相关文章

mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问题 [CSDN博客] mysql 主从复制 双主从复制原理 防止主键重复问题(必看) [CSDN博客] replace into导致mysql自增列导致主键重复问题分析 [CSDN博客] 一个循环更新某库所有表所有非主键列的值方法(sql 2005 & mysql) [CSDN博客] mysql i

MySQL使用on duplicate key update时导致主键不连续自增

使用on duplicate key update语法有时是很方便,但是会有一个影响:默认情况下,每次更新都会更新该表的自增主键ID,如果更新频率很快,会导致主键ID自增的很快,过段时间就超过数字类型的的范围了解决这个问题,有两种方式:(实际目前的方式就是把自增主键ID设置为bigint,也有一部分操作先查询再选择插入OR更新)方法一:拆分成两个动作,先查询,再更新方法二:修改innodb_autoinc_lock_mode参数(不推荐)  innodb_autoinc_lock_mode中有3

mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry 'xxx' for key 'PRIMARY'

mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry 'xxx' for key 'PRIMARY' 解决方法: 在my.cnf的[mysqld]片段中添加设置innodb_autoinc_lock_mode=0 同时注意调大jdbc的活跃链接数,如设置 jdbc.maxActive=300,因为设置innodb_autoinc_lock_mode=0可能导致链接过多. 注意,这种方式只需要在并发性能测试时设置,因为这种方式在插入记录时需

mysql insert 主键 重复问题

转自:http://blog.163.com/[email protected]/blog/static/173131045201222122732435/ mysql中insert into和replace into以及insert ignore用法区别: mysql中常用的三种插入数据的语句: insert into表示插入数据,数据库会检查主键,如果出现重复会报错: replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据,则用

jfinal基本应用 --报主键重复

在使用jfinal 的Model过程中有一个很怪异的问题,发布到服务器上,只要是往表中添加字段,就报主键重复. 1.我添加表的时候调用了 public void create(Map map){ String assocName = (String) map.get("assocName"); String telephone = (String) map.get("telephone"); set(COLLUMNS.ASSOC_NAME, assocName);

C# 使用 GetOleDbSchemaTable 检索架构信息(表、列、主键等)

本文演示如何用 ADO.NET 中 OleDbConnection 对象的 GetOleDbSchemaTable 方法检索数据库架构信息.数据源中的架构信息包括数据库或可通过数据库中的数据源.表和视图得到的目录以及所存在的约束等.表中的架构信息包括主键.列和自动编号字段. 注意,在使用 SqlClient.SqlConnection 对象时没有与 GetOleDbSchemaTable 等价的方法.SQL Server .NET 数据提供程序通过存储过程和信息性视图展示后端架构信息.有关可通过

数据库三范式 无重复列 完全依赖主键 属性不依赖非主属性

细说数据库三范式 2.1 第一范式(1NF)无重复的列 第一范式(1NF)中数据库表的每一列都是不可分割的基本数据项       同一列中不能有多个值       即实体中的某个属性不能有多个值或者不能有重复的属性.       简而言之,第一范式就是无重复的列. 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库. 2.2 第二范式(2NF)属性完全依赖于主键[消除部分子函数依赖] 满足第二范式(2NF)必须先满足第一范式(1NF

成都项目中因为MYSQL与SSDB备分时间不一致,导致主键产生器错误解决一例

-- JFinal错误提示 Duplicate entry '1791361-1823391' for key 'PRIMARY' -- 1.查看SSDB的主键生成器值ssdb 127.0.0.1:8888> scan t_resource_base t_resource_basezzzz 100key             value-------------------------  t_resource_base_pk : 18233911 result(s) (0.001 sec)--

JPA的坑多服务主键重复

配置如下 @Id @GeneratedValue(generator="generator") @GenericGenerator(name="generator",strategy="increment") @Column(name = "id") public Long getId() { return id; } 问题就 出在这 由Hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础,