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