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