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為標志的話可能導(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為標志的話可能導(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)
您可能感興趣的文章:
- 深入mysql "ON DUPLICATE KEY UPDATE" 語法的分析
- Mysql中Insert into xxx on duplicate key update問題
- MySQL的Replace into 與Insert into on duplicate key update真正的不同之處
- mysql insert的幾點操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE )
- MYSQL的REPLACE和ON DUPLICATE KEY UPDATE語句介紹解決問題實例
- MySQL中ON DUPLICATE key update的使用
- mysql特殊語法insert?into?..?on?duplicate?key?update?..使用方法詳析
- MySQL中ON DUPLICATE KEY UPDATE語句的使用
- MySQL中On duplicate key update的實現(xiàn)示例
相關(guān)文章
關(guān)于MYSQL 遠程登錄的授權(quán)方法 命令
默認是不允許遠程連接的,因為有很大的安全隱患。需要手動增加可以遠程訪問數(shù)據(jù)庫的用戶2011-11-11MySQL對字符串使用STR_TO_DATE()函數(shù)詳解
文章介紹了MySQL中的STR_TO_DATE()函數(shù),用于將字符串轉(zhuǎn)換為日期時間類型,轉(zhuǎn)換時需要注意字符串格式、日期有效性等問題2025-03-03mysql alter table命令修改表結(jié)構(gòu)實例
這篇文章主要介紹了mysql alter table命令修改表結(jié)構(gòu)實例的相關(guān)資料,需要的朋友可以參考下2016-10-10Mysql中substring_index函數(shù)實現(xiàn)字符分割一行變多行
在MySQL中,字符串分割是一個常見的操作,本文主要介紹了Mysql中substring_index函數(shù)實現(xiàn)字符分割一行變多行,具有一定的參考價值,感興趣的可以了解一下2023-12-12