看了下复制的问题,最明显的一个案例就是主键冲突,今天就看下这个问题
什么原因会导致这个问题
怎么规避这个问题
一、什么原因导致
网上最多的说就是:对于存在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` (
) ENGINE=InnoDBAUTO_INCREMENT=6
可以看到执行了replace into之后会发现字段增长不一样了,此时master的自增列为7,而slave的自增列为6,与表内最大值相同,若发生主备切换,slave提供服务,此时通过自增列插入主键6的记录,就会发生主键冲突
解决的办法有两个:
我看有的解决是这样的,但是不知道在数据库怎么实现的
<code>if </code><code>not</code> <code>exists (</code><code>select</code> <code>phone </code><code>from</code> <code>t </code><code>where</code> <code>phone= </code><code>'1'</code><code>)</code>
<code> </code><code>insert</code> <code>into</code> <code>t(phone, update_time) </code><code>values</code><code>(</code><code>'1'</code><code>, getdate())</code>
<code> </code><code>else</code>
<code> </code><code>update</code> <code>t </code><code>set</code> <code>update_time = getdate() </code><code>where</code> <code>phone= </code><code>'1'</code>
<code>本文转自 aklaus 51CTO博客,原文链接:http://blog.51cto.com/aklaus/1669577</code>