天天看點

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` (

) 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>