MYSQL更新寫入數據—不同於INSERT INTO 的REPLACE INTO語法介紹

MYSQL更新寫入數據—不同於INSERT INTO 的REPLACE INTO語法介紹

我們在使用 MySQL 數據庫時可能會遇到這種情況。如下Students_hobby_t 表,Id字段為唯一索引,當我們使用 INSERT 向 Students_hobby_t 表中寫入一條記錄,且該條記錄的 Id值已存在於表中,則將會拋出主鍵衝突的錯誤。

當然,有時候我們需要使用新記錄的值來覆蓋原來的記錄值。如果使用傳統的做法,則需要必須先使用DELETE 語句刪除原先的記錄,然後再使用 INSERT 寫入新的記錄。

MYSQL更新寫入數據—不同於INSERT INTO 的REPLACE INTO語法介紹


REPLACE INTO

除此之外,在MySQL中提供了一種新的解決方案,那就是 REPLACE INTO 語句。使用REPLACE寫入一條記錄時, 如果發現表中已經有此行數據(根據主鍵或者唯一索引判斷)則先刪除此行數據,然後插入新的數據。否則,直接插入新數據,避免了在同時使用DELETE和INSERT時添加事務等複雜操作了。

在使用REPLACE時,表中必須存在主鍵索引或唯一索引,而且這個索引所在的字段不能允許空值,否則REPLACE將和INSERT完全一樣的。

如下,使用REPLACE語句是寫入或更新一條記錄。

MYSQL更新寫入數據—不同於INSERT INTO 的REPLACE INTO語法介紹

使用REPLACE寫入或更新多條記錄:

MYSQL更新寫入數據—不同於INSERT INTO 的REPLACE INTO語法介紹

REPLACE也可以使用 SET 語句寫入或更新記錄:

MYSQL更新寫入數據—不同於INSERT INTO 的REPLACE INTO語法介紹

另外,還支持 REPLACE SELECT 用法,即使用REPLACE SELECT從Students_hobby_o 表中將所有數據導入Students_hobby_t 中。這種用法並不要求列名匹配,只關心字段的位置。

MYSQL更新寫入數據—不同於INSERT INTO 的REPLACE INTO語法介紹

如上即為REPLACE INTO語法的三種形式:

  • replace into table(col, …) values(…)
  • replace into table(col, …) select
  • replace into table set col=value, …

除此之外,我們還需要知道。使用 REPLACE寫入一條記錄後,數據庫將返回所影響的行數:

  • 如果返回 1 時,則說明在表中並沒有重複的記錄。
  • 如果返回 2 時,則說明有一條重複記錄,數據庫先自動使用 DELETE刪除這條記錄,然後再使用INSERT 寫入新的記錄。
  • 如果當返回的值大於2 時,則說明存在多個唯一索引,在這種情況下,REPLACE將考慮每一個唯一索引,並對每一個索引對應的重複記錄都刪除,然後再寫入這條新記錄,即有多條記錄被刪除和寫入。

這裡需要注意的是,如果當表中存在多個唯一索引時,使用REPLACE需要注意以下情況,假設有Students_hobby_t 表的Id、Phone都是唯一索引,如下:

MYSQL更新寫入數據—不同於INSERT INTO 的REPLACE INTO語法介紹

此時,我們使用REPLACE 語句向Students_hobby_t 中寫入一條記錄。

MYSQL更新寫入數據—不同於INSERT INTO 的REPLACE INTO語法介紹

返回結果如下:

MYSQL更新寫入數據—不同於INSERT INTO 的REPLACE INTO語法介紹

此時Students_hobby_t 表數據如下:

MYSQL更新寫入數據—不同於INSERT INTO 的REPLACE INTO語法介紹

我們可以看到,REPLACE將原先的2 條記錄都刪除了,然後將新的記錄寫入。


UPDATE和REPLACE的區別

  • UPDATE 中WHERE 條件沒有匹配到記錄時,不執行任何操作。而REPLACE在有重複記錄時執行更新(先刪除後寫入)操作,在沒有重複記錄時執行寫入操作。
  • UPDATE可以選擇性地更新記錄的部分字段,而REPLACE在發現有重複記錄時就將這條記錄徹底刪除,再插入新的記錄,即將所有的字段都更新。

最後,不建議使用REPLACE INTO更新部分字段,可能會導致其它有值字段變為NULL。


分享到:


相關文章: