日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

MYSQL更新寫(xiě)入數(shù)據(jù)—不同于INSERT INTO 的REPLACE INTO語(yǔ)法介紹

 F2967527 2019-11-04
MYSQL更新寫(xiě)入數(shù)據(jù)—不同于INSERT INTO 的REPLACE INTO語(yǔ)法介紹

我們?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ě)入新的記錄。

MYSQL更新寫(xiě)入數(shù)據(jù)—不同于INSERT INTO 的REPLACE INTO語(yǔ)法介紹

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ě)入或更新一條記錄。

MYSQL更新寫(xiě)入數(shù)據(jù)—不同于INSERT INTO 的REPLACE INTO語(yǔ)法介紹

使用REPLACE寫(xiě)入或更新多條記錄:

MYSQL更新寫(xiě)入數(shù)據(jù)—不同于INSERT INTO 的REPLACE INTO語(yǔ)法介紹

REPLACE也可以使用 SET 語(yǔ)句寫(xiě)入或更新記錄:

MYSQL更新寫(xiě)入數(shù)據(jù)—不同于INSERT INTO 的REPLACE INTO語(yǔ)法介紹

另外,還支持 REPLACE SELECT 用法,即使用REPLACE SELECT從Students_hobby_o 表中將所有數(shù)據(jù)導(dǎo)入Students_hobby_t 中。這種用法并不要求列名匹配,只關(guān)心字段的位置。

MYSQL更新寫(xiě)入數(shù)據(jù)—不同于INSERT INTO 的REPLACE INTO語(yǔ)法介紹

如上即為REPLACE INTO語(yǔ)法的三種形式:

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

除此之外,我們還需要知道。使用 REPLACE寫(xiě)入一條記錄后,數(shù)據(jù)庫(kù)將返回所影響的行數(shù):

  • 如果返回 1 時(shí),則說(shuō)明在表中并沒(méi)有重復(fù)的記錄。
  • 如果返回 2 時(shí),則說(shuō)明有一條重復(fù)記錄,數(shù)據(jù)庫(kù)先自動(dòng)使用 DELETE刪除這條記錄,然后再使用INSERT 寫(xiě)入新的記錄。
  • 如果當(dāng)返回的值大于2 時(shí),則說(shuō)明存在多個(gè)唯一索引,在這種情況下,REPLACE將考慮每一個(gè)唯一索引,并對(duì)每一個(gè)索引對(duì)應(yīng)的重復(fù)記錄都刪除,然后再寫(xiě)入這條新記錄,即有多條記錄被刪除和寫(xiě)入。

這里需要注意的是,如果當(dāng)表中存在多個(gè)唯一索引時(shí),使用REPLACE需要注意以下情況,假設(shè)有Students_hobby_t 表的Id、Phone都是唯一索引,如下:

MYSQL更新寫(xiě)入數(shù)據(jù)—不同于INSERT INTO 的REPLACE INTO語(yǔ)法介紹

此時(shí),我們使用REPLACE 語(yǔ)句向Students_hobby_t 中寫(xiě)入一條記錄。

MYSQL更新寫(xiě)入數(shù)據(jù)—不同于INSERT INTO 的REPLACE INTO語(yǔ)法介紹

返回結(jié)果如下:

MYSQL更新寫(xiě)入數(shù)據(jù)—不同于INSERT INTO 的REPLACE INTO語(yǔ)法介紹

此時(shí)Students_hobby_t 表數(shù)據(jù)如下:

MYSQL更新寫(xiě)入數(shù)據(jù)—不同于INSERT INTO 的REPLACE INTO語(yǔ)法介紹

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


UPDATE和REPLACE的區(qū)別

  • 當(dāng)UPDATE 中WHERE 條件沒(méi)有匹配到記錄時(shí),不執(zhí)行任何操作。而REPLACE在有重復(fù)記錄時(shí)執(zhí)行更新(先刪除后寫(xiě)入)操作,在沒(méi)有重復(fù)記錄時(shí)執(zhí)行寫(xiě)入操作。
  • UPDATE可以選擇性地更新記錄的部分字段,而REPLACE在發(fā)現(xiàn)有重復(fù)記錄時(shí)就將這條記錄徹底刪除,再插入新的記錄,即將所有的字段都更新。

最后,不建議使用REPLACE INTO更新部分字段,可能會(huì)導(dǎo)致其它有值字段變?yōu)镹ULL。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多