mysql ON DUPLICATE KEY UPDATE語(yǔ)句示例
更新時(shí)間:2013年11月05日 15:19:05 作者:
本文介紹一下關(guān)于mysql中INSERT INTO… ON DUPLICATE KEY UPDATE用法
MySQL 自4.1版以后開(kāi)始支持INSERT … ON DUPLICATE KEY UPDATE語(yǔ)法,使得原本需要執(zhí)行3條SQL語(yǔ)句(SELECT,INSERT,UPDATE),縮減為1條語(yǔ)句即可完成。
例如ipstats表結(jié)構(gòu)如下:
CREATE TABLE ipstats (
ip VARCHAR(15) NOT NULL UNIQUE,
clicks SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0'
);
原本需要執(zhí)行3條SQL語(yǔ)句,如下:
IF (SELECT * FROM ipstats WHERE ip='192.168.0.1') {
UPDATE ipstats SET clicks=clicks+1 WHERE ip='192.168.0.1';
} else {
INSERT INTO ipstats (ip, clicks) VALUES ('192.168.0.1', 1);
}
而現(xiàn)在只需下面1條SQL語(yǔ)句即可完成:
INSERT INTO ipstats VALUES('192.168.0.1', 1) ON DUPLICATE KEY UPDATE clicks=clicks+1;
注意,要使用這條語(yǔ)句,前提條件是這個(gè)表必須有一個(gè)唯一索引或主鍵。
總結(jié)如下:
1.如果表中不存在主鍵記錄,replace和insert*update都與insert是一樣的特點(diǎn)。
2.如 果表中存在主鍵記錄,replace相當(dāng)于執(zhí)行delete 和 insert兩條操作,而insert*update的相當(dāng)于執(zhí)行if exist do update else do insert操作。因此,如果replace填充的字段不全,則會(huì)導(dǎo)致未被更新的字段都會(huì)修改為默認(rèn)值,并且如果有自增id的話,自增id會(huì)變化為最新的 值(這樣如果是以自增id為標(biāo)志的話可能導(dǎo)致記錄丟失);而insert*update只是更新部分字段,對(duì)于未被更新的字段不會(huì)變化(不會(huì)強(qiáng)制修改為默 認(rèn)值)。
多條記錄操作:
insert into t(a,b,c) values ('a1','b1','c1'),('a2','b2','c2')
on duplicate key update t.c=values(t.c)
例如ipstats表結(jié)構(gòu)如下:
復(fù)制代碼 代碼如下:
CREATE TABLE ipstats (
ip VARCHAR(15) NOT NULL UNIQUE,
clicks SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0'
);
原本需要執(zhí)行3條SQL語(yǔ)句,如下:
復(fù)制代碼 代碼如下:
IF (SELECT * FROM ipstats WHERE ip='192.168.0.1') {
UPDATE ipstats SET clicks=clicks+1 WHERE ip='192.168.0.1';
} else {
INSERT INTO ipstats (ip, clicks) VALUES ('192.168.0.1', 1);
}
而現(xiàn)在只需下面1條SQL語(yǔ)句即可完成:
復(fù)制代碼 代碼如下:
INSERT INTO ipstats VALUES('192.168.0.1', 1) ON DUPLICATE KEY UPDATE clicks=clicks+1;
注意,要使用這條語(yǔ)句,前提條件是這個(gè)表必須有一個(gè)唯一索引或主鍵。
總結(jié)如下:
1.如果表中不存在主鍵記錄,replace和insert*update都與insert是一樣的特點(diǎn)。
2.如 果表中存在主鍵記錄,replace相當(dāng)于執(zhí)行delete 和 insert兩條操作,而insert*update的相當(dāng)于執(zhí)行if exist do update else do insert操作。因此,如果replace填充的字段不全,則會(huì)導(dǎo)致未被更新的字段都會(huì)修改為默認(rèn)值,并且如果有自增id的話,自增id會(huì)變化為最新的 值(這樣如果是以自增id為標(biāo)志的話可能導(dǎo)致記錄丟失);而insert*update只是更新部分字段,對(duì)于未被更新的字段不會(huì)變化(不會(huì)強(qiáng)制修改為默 認(rèn)值)。
多條記錄操作:
復(fù)制代碼 代碼如下:
insert into t(a,b,c) values ('a1','b1','c1'),('a2','b2','c2')
on duplicate key update t.c=values(t.c)
相關(guān)文章
MySQL數(shù)據(jù)庫(kù)存儲(chǔ)引擎介紹及數(shù)據(jù)庫(kù)的操作詳解
mysql面試中最常問(wèn)的問(wèn)題之一:小伙子,你說(shuō)一下你們公司用的存儲(chǔ)引擎,以及你知道有哪些存儲(chǔ)引擎和他們之間的區(qū)別? 所以下面這篇文章主要給大家介紹了關(guān)于Mysql存儲(chǔ)引擎的相關(guān)資料,需要的朋友可以參考下2022-08-08CentOS系統(tǒng)下如何設(shè)置mysql每天自動(dòng)備份
備份是容災(zāi)的基礎(chǔ),是指為防止系統(tǒng)出現(xiàn)操作失誤或系統(tǒng)故障導(dǎo)致數(shù)據(jù)丟失,而將全部或部分?jǐn)?shù)據(jù)集合從應(yīng)用主機(jī)的硬盤(pán)或陣列復(fù)制到其它的存儲(chǔ)介質(zhì)的過(guò)程。本文將詳細(xì)介紹在CentOS系統(tǒng)下如何設(shè)置mysql每天自動(dòng)備份,有需要的朋友們下面來(lái)一起看看吧。2016-10-10高性能MySQL讀書(shū)筆記 找出誰(shuí)持有鎖
周末重讀了一遍《高性能MySQL》,發(fā)現(xiàn)有些知識(shí)點(diǎn)看過(guò)便忘了,沒(méi)有實(shí)際動(dòng)手操作一遍就是記不牢,所以今天動(dòng)手操作了一下“找出誰(shuí)持有鎖”,并把實(shí)驗(yàn)步驟記錄下來(lái),有興趣的網(wǎng)友可以參照一二。2011-01-01mysql入門(mén)之1小時(shí)學(xué)會(huì)MySQL基礎(chǔ)
今天剛好看到了SYZ01的這篇mysql入門(mén)文章,感覺(jué)對(duì)于想學(xué)習(xí)mysql的朋友是個(gè)不錯(cuò)的資料,腳本之家特分享一下,需要的朋友可以參考下2018-01-01Mysql數(shù)據(jù)庫(kù)中子查詢(xún)的使用
本文給大家分享mysql數(shù)據(jù)庫(kù)中子查詢(xún)的使用,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-10-10wamp中mysql安裝時(shí)能啟動(dòng)重啟后無(wú)法啟動(dòng)的解決辦法
這篇文章主要介紹了wamp中mysql安裝時(shí)能啟動(dòng)重啟后無(wú)法啟動(dòng)的解決辦法 ,需要的朋友可以參考下2018-08-08面試中老生常談的MySQL問(wèn)答集錦夯實(shí)基礎(chǔ)
這篇文章主要為大家介紹了面試中老生常談的MySQL問(wèn)答集錦,不僅可以幫助大家順利通過(guò)面試更可以夯實(shí)大家的基礎(chǔ),有需要的朋友可以借鑒參考下2022-03-03