標籤:replace master values 網上
看了下複製的問題,最明顯的一個案例就是主鍵衝突,今天就看下這個問題
什麼原因會導致這個問題
怎麼規避這個問題
一、什麼原因導致
網上最多的說就是:對於存在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‘
MySQL 複製 主鍵衝突