MySQL 复制 主键冲突

看了下复制的问题,最明显的一个案例就是主键冲突,今天就看下这个问题

  1. 什么原因会导致这个问题
  2. 怎么规避这个问题

一、什么原因导致

网上最多的说就是:对于存在auto_increment字段或者unique索引字段,使用replace into操作或者主从切换,因为replace into对于auto或者unique字段会进行删除再做插入

执行replace into t values(1,2)被删除和被插入的行数的和(大于或者等于1)

master 上 SHOW 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

slave 上 SHOW 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

可以看到执行了replace into之后会发现字段增长不一样了,此时master的自增列为7,而slave的自增列为6,与表内最大值相同,若发生主备切换,slave提供服务,此时通过自增列插入主键6的记录,就会发生主键冲突

解决的办法有两个:

1st suggested fix is: use a delete event and a insert event  to record this replace.
2nd suggested fix is: update the auto_incrment in update statements.

我看有的解决是这样的,但是不知道在数据库怎么实现的

if not exists (select phone from t where phone= ‘1‘)

            insert into t(phone, update_time) values(‘1‘, getdate())

 else

          update t set update_time = getdate() where phone= ‘1‘


时间: 2024-10-25 11:54:25

MySQL 复制 主键冲突的相关文章

13.MySQL解决主键冲突

1.准备 1 CREATE DATABASE mahaiwuji; 2 USE mahaiwuji; 3 ? 4 CREATE TABLE emp 5 ( 6 empno INT PRIMARY KEY, 7 ename VARCHAR(10), 8 sal INT 9 ) ENGINE = INNODB DEFAULT CHARSET = utf8; 10 ? 11 INSERT INTO emp VALUES (1,'smith',2800); 12 INSERT INTO emp VALU

mysql主从之主键冲突

收到短信报警,两台数据库都报slave同步失败了,先说明一下环境,架构:lvs+keepalived+amoeba+mysql,主主复制,单台写入, 主1:192.168.0.223(写) 主2:192.168.0.230 好吧,先show slave status \G看一下同步失败的具体报错吧 登录主2库查看: mysql> show slave status \G *************************** 1. row ***************************

mysql主从:主键冲突问题

1.检查从库 show slave status \G; Slave_IO_Running: YesSlave_SQL_Running: No 2.出现类似如下的报错: Last_SQL_Error: Error 'Duplicate entry '1001-164761-0' for key 'PRIMARY'' on query. Default database: 'bug'. Query: 'insert into misdata (uid,mid,pid,state,mtime) va

mysql修改数据 -- 主键冲突

mysql 插入数据唯一键冲突 前提: 修改数据三种可用的方法解决主键冲突的问题 1. insert into ... on duplicate key update set ... 2. update ... set = case key when ... then ... when ... then ... else end where ...; 3. replace into ... (与1相似,但若主键冲突会先删除原数据,后再插入新数据 ,所以运用时最好带上主键) 例: table :

[转]主键冲突的话就更新否则插入 (ON DUPLICATE KEY UPDATE )

mysql "ON DUPLICATE KEY UPDATE" 语法如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不会导致唯一值列重复的问题,则插入新行. 例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果: INSERT INTO TABLE (a,c) VALUES (1,3) ON D

解决MySQL复合主键下ON DUPLICATE KEY UPDATE语句失效问题

先描述一下这个问题的起因,假设有一张表,里面保存了交易订单,每张订单有唯一的ID,有最后更新时间,还有数据,详情如下: +-------+----------+------+-----+---------------------+-------+ | Field | Type     | Null | Key | Default             | Extra | +-------+----------+------+-----+---------------------+-------

insert时出现主键冲突的处理方法

使用"insert into"语句进行数据库操作时可能遇到主键冲突,用户需要根据应用场景进行忽略或者覆盖等操作.总结下,有三种解决方案来避免出错. 测试表:CREATE TABLE `device` (`devid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,`status` enum('alive','dead','down','readonly','drain') DEFAULT NULL,`spec_char` varchar(1

sql解决主键冲突

在数据插入的时候,假设主键对应的值已经存在,则插入失败!这就是主键冲突.当主键存在冲突(duplicate key)的时候,可以选择性的进行处理,即忽略.更新或者替换. 1.忽略 insert ignore into table 保持原记录,忽略新插入的记录 2.替换 replace into table 替换原记录,即先删除原记录,再插入新的记录 3. 更新 insert into table value("xx","xx") ON DUPLICATE KEY U

django使用postgresql时提示主键冲突

在django使用postgresql数据库时,当你使用默认主键,但当你手动使用添加记录到相关数据库时(非insert操作,如使用navicate直接在表中复制粘贴记录),此时django在插入数据时,会提示主键冲突,这是因为postgresql的主键自增是建立在它内部机制工作的,你可以使用如下sql来获取或设置相关的自增ID序列: select nextval('表名_id_seq'); #此操作会获取当前基于表中最大ID,并会设置ID+1 select currval('表名_id_seq'