mysql的replace into“坑”

在向表中插入數據的時候,經常遇到這樣的情況:1. 首先判斷數據是否存在; 2. 如果不存在,則插入;3.如果存在,則更新。
 
這種情況就可以使用replace into語句來解決,但是有沒有問題,且看下去
 
下面是數據更新前的樣子

在auto這個表中,k字段是唯一索引,當執行replace into auto (k,v) values (10,11);後,數據變爲
 

 
 從圖中可以看到,id=10的那條記錄沒有了,新增加了一條id=23的記錄,而且k,v的值正好是咱們剛想更新的值
 
再執行一個語句replace into auto (k,v) values (9,9);觀察結果如下
 
這次是真的增加了一條id=24的記錄,而其他記錄沒有任何變化。
 
通過以上操作可以看出replace into執行的邏輯
1、遇到PRIMARY KEY或UNIQUE索引的,新記錄與舊記錄有衝突的(這裏實際產生了異常duplicate key error),會把舊記錄刪除,然後再插入新記錄
2、若是新記錄沒有衝突,就直接插入一條新記錄,與insert into一樣
 
看起來很正常,這裏針對第一種邏輯會有問題
1、把舊記錄刪除之後,插入的新記錄只是插入了那些指定的字段,原本不想更新的字段,直接爲默認值了,會導致數據丟失
2、若舊記錄的id跟其他表是有關聯的,更新後新記錄會產生新的id,導致這種關聯丟失
3、而且使用replace into會導致自增主鍵id一直增大,很容易導致id值範圍不夠用
另外,若是數據庫存在主從關係,在主機器上進行了replace into操作之後,從機器上對應表的AUTO_INCREMENT是不會更新的,導致從機器轉爲主機器時,新插入數據會出現異常,直到AUTO_INCREMENT增加到原來主機器的值爲止。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章