MySQL中幾種插入和批量語句實(shí)例詳解
前言
最常見的方式就是為字段設(shè)置主鍵或唯一索引,當(dāng)插入重復(fù)數(shù)據(jù)時(shí),拋出錯(cuò)誤,程序終止,但這會(huì)給后續(xù)處理帶來麻煩,因此需要對(duì)插入語句做特殊處理,盡量避開或忽略異常,下面我簡(jiǎn)單介紹一下,感興趣的朋友可以嘗試一下:
這里為了方便演示,我新建了一個(gè)user測(cè)試表,主要有id,username,sex,address這4個(gè)字段,其中主鍵為id(自增),同時(shí)對(duì)username字段設(shè)置了唯一索引(idx_username)
1.insert ignore into
即插入數(shù)據(jù)時(shí),如果數(shù)據(jù)存在,則忽略此次插入,前提條件是插入的數(shù)據(jù)字段設(shè)置了主鍵或唯一索引,測(cè)試SQL語句如下,當(dāng)插入本條數(shù)據(jù)時(shí),MySQL數(shù)據(jù)庫會(huì)首先檢索已有數(shù)據(jù)(也就是idx_username索引),如果存在,則忽略本次插入,如果不存在,則正常插入數(shù)據(jù):
INSERT IGNORE INTO user (username,sex,address) VALUES ('hanpang','boy','HongKong')
2.on duplicate key update
即插入數(shù)據(jù)時(shí),如果數(shù)據(jù)存在,則執(zhí)行更新操作,前提條件同上,也是插入的數(shù)據(jù)字段設(shè)置了主鍵或唯一索引,測(cè)試SQL語句如下,當(dāng)插入本條記錄時(shí),MySQL數(shù)據(jù)庫會(huì)首先檢索已有數(shù)據(jù)(idx_username索引),如果存在,則執(zhí)行update更新操作,如果不存在,則直接插入:
INSERT IGNORE INTO user (username,sex,address) VALUES ('hanpang','boy','HongKong') on duplicate key update SEX='boy',address='HongKong'
3.replace into
即插入數(shù)據(jù)時(shí),如果數(shù)據(jù)存在,則刪除再插入,前提條件同上,插入的數(shù)據(jù)字段需要設(shè)置主鍵或唯一索引,測(cè)試SQL語句如下,當(dāng)插入本條記錄時(shí),MySQL數(shù)據(jù)庫會(huì)首先檢索已有數(shù)據(jù)(idx_username索引),如果存在,則先刪除舊數(shù)據(jù),然后再插入,如果不存在,則直接插入:
REPLACE INTO user (username,sex,address) VALUES ('hanpang','boy','HongKong')
4.insert if not exists
即 insert into … select … where not exist ... ,這種方式適合于插入的數(shù)據(jù)字段沒有設(shè)置主鍵或唯一索引,當(dāng)插入一條數(shù)據(jù)時(shí),首先判斷MySQL數(shù)據(jù)庫中是否存在這條數(shù)據(jù),如果不存在,則正常插入,如果存在,則忽略:
INSERT INTO user (username,sex,address) SELECT 'hanpang','boy','HongKong' FROM user WHERE NOT EXISTS (SELECT username FROM user WHERE username='hanpang')
5.批量插入數(shù)據(jù)
上述的插入語句,是可以使用批量插入語句,表數(shù)據(jù)結(jié)構(gòu):
CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( 50 ) NOT NULL, value VARCHAR( 50 ) NOT NULL, other_value VARCHAR( 50 ) NOT NULL )
個(gè)人習(xí)慣使用這種批量操作方式,進(jìn)行SQL語句拼接,但是當(dāng)你的字符串太長(zhǎng)(百萬數(shù)據(jù))的時(shí)候,需要你對(duì)mysql設(shè)置指令:
INSERT INTO example VALUES (100, 'Name 1', 'Value 1', 'Other 1'), (101, 'Name 2', 'Value 2', 'Other 2'), (102, 'Name 3', 'Value 3', 'Other 3'), (103, 'Name 4', 'Value 4', 'Other 4');
實(shí)際開發(fā)中,我們更加喜歡使用通過程序代碼進(jìn)行批量添加操作(使用事務(wù)提交,批量插入數(shù)據(jù)庫),使用上述的方式在插入測(cè)試數(shù)據(jù)或者其他低要求時(shí)比較合適,速度確實(shí)快。
6.批量更新
(1)replace into 批量更新(記得要有主鍵或者索引)
INSERT INTO example VALUES (100, 'Name 1', 'Value 1', 'Other 1'), (101, 'Name 2', 'Value 2', 'Other 2'), (102, 'Name 3', 'Value 3', 'Other 3'), (103, 'Name 4', 'Value 4', 'Other 4');
(2)insert into ...on duplicate key update批量更新
使用INSERT的時(shí)候 有表T(id,A,B,C,D)
插入的時(shí)候希望通過A,B索引唯一記錄 ,有重復(fù)的時(shí)候更新C,D
INSERT INTO T(A,B,C,D) VALUES (a,b,c,d) ON DUPLICATE KEY UPDATE C=C+1,D=d
(3)使用mysql 自帶的語句構(gòu)建批量更新
UPDATE yoiurtable SET dingdan = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END WHERE id IN (1,2,3)
(4)創(chuàng)建臨時(shí)表,先更新臨時(shí)表,然后從臨時(shí)表中update
create temporary table tmp(id int(4) primary key,dr varchar(50)); insert into tmp values (0,'gone'), (1,'xx'),...(m,'yy'); update test_tbl, tmp set test_tbl.dr=tmp.dr where test_tbl.id=tmp.id;
總結(jié)
到此這篇關(guān)于MySQL中幾種插入和批量語句的文章就介紹到這了,更多相關(guān)MySQL插入和批量語句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql之臟讀、不可重復(fù)讀、幻讀的區(qū)別及說明
這篇文章主要介紹了mysql之臟讀、不可重復(fù)讀、幻讀的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07mysql如何創(chuàng)建數(shù)據(jù)庫并指定字符集
這篇文章主要介紹了mysql如何創(chuàng)建數(shù)據(jù)庫并指定字符集問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12MySQL存儲(chǔ)引擎MyISAM與InnoDB的9點(diǎn)區(qū)別
這篇文章主要介紹了MySQL存儲(chǔ)引擎MyISAM與InnoDB的9點(diǎn)區(qū)別,寫給有選擇困難癥的同學(xué),需要的朋友可以參考下2014-08-08centos上安裝mysql并設(shè)置遠(yuǎn)程訪問的操作方法
這篇文章主要介紹了centos上安裝mysql并設(shè)置遠(yuǎn)程訪問的操作方法,需要的朋友可以參考下2017-11-11教你使用VS?Code的MySQL擴(kuò)展管理數(shù)據(jù)庫的方法
這篇文章主要介紹了使用VS?Code的MySQL擴(kuò)展管理數(shù)據(jù)庫,在本文告訴你如何用VS?Code的擴(kuò)展程序管理MySQL數(shù)據(jù)庫,包括連接到MySQL、新建數(shù)據(jù)庫和表、修改字段定義、簡(jiǎn)單的查詢方法以及導(dǎo)入導(dǎo)出,需要的朋友可以參考下2022-01-01Win10安裝mysql8.0.15 winx64及連接服務(wù)器過程中遇到的問題
這篇文章主要介紹了Win10安裝mysql8.0.15 winx64及連接服務(wù)器過程中遇到的問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12MySQL在grant時(shí)報(bào)錯(cuò)ERROR?1064?(42000)的原因及解決方法
網(wǎng)上查到的grant方式大多會(huì)報(bào)錯(cuò),主要原因是MySQL版本8.0后不能再使用原來的方式,這篇文章主要介紹了MySQL在grant時(shí)報(bào)錯(cuò)ERROR?1064?(42000),需要的朋友可以參考下2022-08-08MySQL中find_in_set()函數(shù)用法示例詳解
find_in_set這個(gè)是mysql的一個(gè)函數(shù),見得比較少,下面這篇文章主要給大家介紹了關(guān)于MySQL中find_in_set()函數(shù)用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09