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版以后開始支持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 關(guān)于兩個(gè)經(jīng)緯度之間的距離由近及遠(yuǎn)排序
本篇文章是對(duì)MYSQL中關(guān)于兩個(gè)經(jīng)緯度之間的距離由近及遠(yuǎn)排序的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
MYSQL查詢時(shí)間范圍內(nèi)的數(shù)據(jù)示例代碼
這篇文章主要介紹了MYSQL查詢時(shí)間范圍內(nèi)的數(shù)據(jù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
Navicat自動(dòng)備份MySQL數(shù)據(jù)的流程步驟
對(duì)于從事IT開發(fā)的工程師,數(shù)據(jù)備份我想大家并不陌生,這件工程太重要了!對(duì)于比較重要的數(shù)據(jù),我們希望能定期備份,每天備份1次或多次,或者是每周備份1次或多次,所以本文給大家介紹了Navicat自動(dòng)備份MySQL數(shù)據(jù)的流程步驟,需要的朋友可以參考下2024-12-12
lnmp下如何關(guān)閉Mysql日志保護(hù)磁盤空間
這篇文章主要介紹了lnmp下如何關(guān)閉Mysql日志保護(hù)磁盤空間的相關(guān)資料,需要的朋友可以參考下2015-09-09
MySQL ClickHouse常用表引擎超詳細(xì)講解
這篇文章主要介紹了MySQL ClickHouse常用表引擎,ClickHouse表引擎中,CollapsingMergeTree和VersionedCollapsingMergeTree都能通過標(biāo)記位按規(guī)則折疊數(shù)據(jù),從而達(dá)到更新和刪除的效果2022-11-11
一文搞懂mysql如何處理json格式的字段(解析json數(shù)據(jù))
這篇文章主要給大家介紹了關(guān)于mysql如何處理json格式的字段的相關(guān)資料,MySQL中的JSON類型是一種數(shù)據(jù)類型,用于存儲(chǔ)和處理JSON(JavaScript Object Notation)格式的數(shù)據(jù),需要的朋友可以參考下2023-12-12
MySQL數(shù)據(jù)庫(kù)終端—常用操作指令代碼
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)終端—常用操作指令代碼,添加用戶、更改用戶名和host主機(jī)、更改密碼、刪除用戶等等,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-01-01
MySQL 導(dǎo)出一條數(shù)據(jù)的插入語(yǔ)句(示例詳解)
在MySQL中,如果我們想要導(dǎo)出一條數(shù)據(jù)的插入語(yǔ)句,我們可以使用SELECT ... INTO OUTFILE語(yǔ)句,這篇文章主要介紹了MySQL 導(dǎo)出一條數(shù)據(jù)的插入語(yǔ)句,需要的朋友可以參考下2024-06-06

