mysql ON DUPLICATE KEY UPDATE語句示例
更新時間:2013年11月05日 15:19:05 作者:
本文介紹一下關(guān)于mysql中INSERT INTO… ON DUPLICATE KEY UPDATE用法
MySQL 自4.1版以后開始支持INSERT … ON DUPLICATE KEY UPDATE語法,使得原本需要執(zhí)行3條SQL語句(SELECT,INSERT,UPDATE),縮減為1條語句即可完成。
例如ipstats表結(jié)構(gòu)如下:
CREATE TABLE ipstats (
ip VARCHAR(15) NOT NULL UNIQUE,
clicks SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0'
);
原本需要執(zhí)行3條SQL語句,如下:
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語句即可完成:
INSERT INTO ipstats VALUES('192.168.0.1', 1) ON DUPLICATE KEY UPDATE clicks=clicks+1;
注意,要使用這條語句,前提條件是這個表必須有一個唯一索引或主鍵。
總結(jié)如下:
1.如果表中不存在主鍵記錄,replace和insert*update都與insert是一樣的特點。
2.如 果表中存在主鍵記錄,replace相當(dāng)于執(zhí)行delete 和 insert兩條操作,而insert*update的相當(dāng)于執(zhí)行if exist do update else do insert操作。因此,如果replace填充的字段不全,則會導(dǎo)致未被更新的字段都會修改為默認值,并且如果有自增id的話,自增id會變化為最新的 值(這樣如果是以自增id為標(biāo)志的話可能導(dǎo)致記錄丟失);而insert*update只是更新部分字段,對于未被更新的字段不會變化(不會強制修改為默 認值)。
多條記錄操作:
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語句,如下:
復(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語句即可完成:
復(fù)制代碼 代碼如下:
INSERT INTO ipstats VALUES('192.168.0.1', 1) ON DUPLICATE KEY UPDATE clicks=clicks+1;
注意,要使用這條語句,前提條件是這個表必須有一個唯一索引或主鍵。
總結(jié)如下:
1.如果表中不存在主鍵記錄,replace和insert*update都與insert是一樣的特點。
2.如 果表中存在主鍵記錄,replace相當(dāng)于執(zhí)行delete 和 insert兩條操作,而insert*update的相當(dāng)于執(zhí)行if exist do update else do insert操作。因此,如果replace填充的字段不全,則會導(dǎo)致未被更新的字段都會修改為默認值,并且如果有自增id的話,自增id會變化為最新的 值(這樣如果是以自增id為標(biāo)志的話可能導(dǎo)致記錄丟失);而insert*update只是更新部分字段,對于未被更新的字段不會變化(不會強制修改為默 認值)。
多條記錄操作:
復(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)于兩個經(jīng)緯度之間的距離由近及遠排序
本篇文章是對MYSQL中關(guān)于兩個經(jīng)緯度之間的距離由近及遠排序的方法進行了詳細的分析介紹,需要的朋友參考下2013-07-07
MYSQL查詢時間范圍內(nèi)的數(shù)據(jù)示例代碼
這篇文章主要介紹了MYSQL查詢時間范圍內(nèi)的數(shù)據(jù),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06
Navicat自動備份MySQL數(shù)據(jù)的流程步驟
對于從事IT開發(fā)的工程師,數(shù)據(jù)備份我想大家并不陌生,這件工程太重要了!對于比較重要的數(shù)據(jù),我們希望能定期備份,每天備份1次或多次,或者是每周備份1次或多次,所以本文給大家介紹了Navicat自動備份MySQL數(shù)據(jù)的流程步驟,需要的朋友可以參考下2024-12-12
一文搞懂mysql如何處理json格式的字段(解析json數(shù)據(jù))
這篇文章主要給大家介紹了關(guān)于mysql如何處理json格式的字段的相關(guān)資料,MySQL中的JSON類型是一種數(shù)據(jù)類型,用于存儲和處理JSON(JavaScript Object Notation)格式的數(shù)據(jù),需要的朋友可以參考下2023-12-12
MySQL 導(dǎo)出一條數(shù)據(jù)的插入語句(示例詳解)
在MySQL中,如果我們想要導(dǎo)出一條數(shù)據(jù)的插入語句,我們可以使用SELECT ... INTO OUTFILE語句,這篇文章主要介紹了MySQL 導(dǎo)出一條數(shù)據(jù)的插入語句,需要的朋友可以參考下2024-06-06

