1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > MySQL 复制 主键冲突

MySQL 复制 主键冲突

时间:2021-10-10 13:00:04

相关推荐

MySQL 复制 主键冲突

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

什么原因会导致这个问题

怎么规避这个问题

一、什么原因导致

网上最多的说就是:对于存在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的记录,就会发生主键冲突

解决的办法有两个:

1stsuggestedfixis:useadeleteeventandainserteventtorecordthisreplace.2ndsuggestedfixis:updatetheauto_incrmentinupdatestatements.

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

ifnotexists (selectphonefromtwherephone='1')insertintot(phone, update_time)values('1', getdate())else

updatetsetupdate_time = getdate()wherephone='1'

本文转自 aklaus 51CTO博客,原文链接:/aklaus/1669577

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。