我們在使用 MySQL 資料庫時可能會遇到這種情況。如下Students_hobby_t 表,Id欄位為唯一索引,當我們使用 INSERT 向 Students_hobby_t 表中寫入一條記錄,且該條記錄的 Id值已存在於表中,則將會拋出主鍵衝突的錯誤。
當然,有時候我們需要使用新記錄的值來覆蓋原來的記錄值。如果使用傳統的做法,則需要必須先使用DELETE 語句刪除原先的記錄,然後再使用 INSERT 寫入新的記錄。
除此之外,在MySQL中提供了一種新的解決方案,那就是 REPLACE INTO 語句。使用REPLACE寫入一條記錄時, 如果發現表中已經有此行數據(根據主鍵或者唯一索引判斷)則先刪除此行數據,然後插入新的數據。否則,直接插入新數據,避免了在同時使用DELETE和INSERT時添加事務等複雜操作了。
在使用REPLACE時,表中必須存在主鍵索引或唯一索引,而且這個索引所在的欄位不能允許空值,否則REPLACE將和INSERT完全一樣的。
如下,使用REPLACE語句是寫入或更新一條記錄。
使用REPLACE寫入或更新多條記錄:
REPLACE也可以使用 SET 語句寫入或更新記錄:
另外,還支持 REPLACE SELECT 用法,即使用REPLACE SELECT從Students_hobby_o 表中將所有數據導入Students_hobby_t 中。這種用法並不要求列名匹配,只關心欄位的位置。
如上即為REPLACE INTO語法的三種形式:
除此之外,我們還需要知道。使用 REPLACE寫入一條記錄後,資料庫將返回所影響的行數:
這裡需要注意的是,如果當表中存在多個唯一索引時,使用REPLACE需要注意以下情況,假設有Students_hobby_t 表的Id、Phone都是唯一索引,如下:
此時,我們使用REPLACE 語句向Students_hobby_t 中寫入一條記錄。
返回結果如下:
此時Students_hobby_t 表數據如下:
我們可以看到,REPLACE將原先的2 條記錄都刪除了,然後將新的記錄寫入。
最後,不建議使用REPLACE INTO更新部分欄位,可能會導致其它有值欄位變為NULL。