mysql特殊語法insert?into?..?on?duplicate?key?update?..使用方法詳析
一、前言
在日常開發(fā)中,經(jīng)常會(huì)遇到這樣的需求:查看某條記錄是否存在,不存在的話創(chuàng)建一條新記錄,存在的話更新某些字段。
比如下列偽代碼:
$row = mysql_query($result); if($row){ mysql_execute('update ...'); }else{ mysql_execute('insert ...'); }
二、insert into … on duplicate key update …
MySql針對(duì)此,提供了insert into … on duplicate key update …的語法:
- 在insert的時(shí)候,如果insert的數(shù)據(jù)會(huì)引起唯一索引(包括主鍵索引)的沖突,即唯一值重復(fù)了,則不會(huì)執(zhí)行insert操作,而執(zhí)行后面的update操作。
注意:這個(gè)是MYSQL特有的,不是SQL標(biāo)準(zhǔn)語法;
1、處理邏輯
insert into … on duplicate key update …語句是根據(jù)唯一索引判斷記錄是否重復(fù)的;
- 如果不存在記錄,插入,則影響的行數(shù)為1;
- 如果存在記錄,可以更新字段,則影響的行數(shù)為2;
- 如果存在記錄,并且更新的值和原有的值相同,則影響的行數(shù)為0。
如果表同時(shí)存在多個(gè)唯一索引,只會(huì)根據(jù)第一個(gè)在數(shù)據(jù)庫中存在相應(yīng)value的唯一索引做duplicate判斷:
2、示例:
表結(jié)構(gòu)
CREATE TABLE `user2` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(94) NOT NULL, `age` int(11) DEFAULT NULL, `gender` int(1) DEFAULT NULL, `type` int(1) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `idex_name` (`userName`) USING BTREE, KEY `idx_type` (`type`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
user2表中有一個(gè)主鍵id、一個(gè)唯一索引idx_userName;
1> 不存在記錄,插入的情況
insert into user2(userName, age, gender) VALUES("saint33", 99, 1) on DUPLICATE KEY UPDATE age = 88;
2> 存在記錄,可以更新字段的情況
insert into user2(userName, age, gender) VALUES("saint33", 99, 1) on DUPLICATE KEY UPDATE age = 88;
3> 存在記錄,不可以更新字段的情況
insert into user2(userName, age, gender) VALUES("saint33", 99, 1) on DUPLICATE KEY UPDATE age = 88;
4> 存在多個(gè)唯一索引時(shí)
如果表同時(shí)存在多個(gè)唯一索引,只會(huì)根據(jù)第一個(gè)在數(shù)據(jù)庫中存在相應(yīng)value的唯一索引做duplicate判斷:
1)數(shù)據(jù)庫中id = 12的記錄不存在,userName="saint22"的記錄存在,所以會(huì)根據(jù)第二個(gè)唯一索引userName做duplicate判斷;
insert into user2(id, userName, age, gender) VALUES(12, "saint22", 99, 1) on DUPLICATE KEY UPDATE age = VALUES(gender) + 80;
2)數(shù)據(jù)庫中id = 10的記錄存在,userName="saint22"的記錄存在,所以會(huì)根據(jù)第一個(gè)唯一索引id做duplicate判斷;
insert into user2(id, userName, age, gender) VALUES(10, "saint22", 99, 1) on DUPLICATE KEY UPDATE age = VALUES(gender) + 90;
3、Update子句獲取inset部分的值
Update子句可以使用values(col_name)獲取insert部分的值:
insert into user2(userName, age, gender) VALUES("saint22", 99, 1) on DUPLICATE KEY UPDATE age = VALUES(age) + 100;
注意:VALUES()函數(shù)只在INSERT…UPDATE語句中有意義,其它時(shí)候會(huì)返回NULL;
4、last_insert_id()
如果表含有auto_increment字段,使用insert … on duplicate key update插入或更新后,last_insert_id()返回auto_increment字段的值。
總結(jié)
到此這篇關(guān)于mysql特殊語法insert into .. on duplicate key update ..使用方法的文章就介紹到這了,更多相關(guān)insert into .. on duplicate key update內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 深入mysql "ON DUPLICATE KEY UPDATE" 語法的分析
- Mysql中Insert into xxx on duplicate key update問題
- MySQL的Replace into 與Insert into on duplicate key update真正的不同之處
- mysql ON DUPLICATE KEY UPDATE語句示例
- mysql insert的幾點(diǎn)操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE )
- MYSQL的REPLACE和ON DUPLICATE KEY UPDATE語句介紹解決問題實(shí)例
- MySQL中ON DUPLICATE key update的使用
- MySQL中ON DUPLICATE KEY UPDATE語句的使用
- MySQL中On duplicate key update的實(shí)現(xiàn)示例
相關(guān)文章
MYSQL設(shè)置字段自動(dòng)獲取當(dāng)前時(shí)間的sql語句
整理數(shù)據(jù)庫數(shù)據(jù),看到好多表都有加create_time和 update_time字段,來記錄數(shù)據(jù)插入的時(shí)間和更新時(shí)間,但是時(shí)間插入是通過代碼來維護(hù)的,這篇文章主要介紹了MYSQL設(shè)置字段自動(dòng)獲取當(dāng)前時(shí)間,需要的朋友可以參考下2023-07-07MySQL IS NULL空值查詢的實(shí)現(xiàn)
MySQL 提供了?IS NULL?關(guān)鍵字,用來判斷字段的值是否為空值,本文主要介紹了MySQL IS NULL空值查詢的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08MySQL使用外鍵實(shí)現(xiàn)級(jí)聯(lián)刪除與更新的方法
這篇文章主要介紹了MySQL使用外鍵實(shí)現(xiàn)級(jí)聯(lián)刪除與更新的方法,詳細(xì)分析了mysql數(shù)據(jù)庫與表的創(chuàng)建、數(shù)據(jù)插入、查詢以及外鏈的使用與級(jí)聯(lián)操作相關(guān)技巧,需要的朋友可以參考下2016-07-07完美解決mysql啟動(dòng)后隨即關(guān)閉的問題(ibdata1文件損壞導(dǎo)致)
下面小編就為大家?guī)硪黄昝澜鉀Qmysql啟動(dòng)后隨即關(guān)閉的問題(ibdata1文件損壞導(dǎo)致)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03分析一條sql的性能的標(biāo)準(zhǔn)總結(jié)
在本篇文章里小編給各位分享了關(guān)于分析一條sql的性能的相關(guān)知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2019-07-07mysql 導(dǎo)入導(dǎo)出數(shù)據(jù)庫以及函數(shù)、存儲(chǔ)過程的介紹
本篇文章是對(duì)mysql中的導(dǎo)入導(dǎo)出數(shù)據(jù)庫命令以及函數(shù)、存儲(chǔ)過程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07