mysql insert的幾點(diǎn)操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE )
更新時(shí)間:2010年04月14日 13:46:04 作者:
DELAYED 做為快速插入,并不是很關(guān)心失效性,提高插入性能。
INSERT語法
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
或:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
或:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
一、DELAYED 的使用
使用延遲插入操作
DELAYED調(diào)節(jié)符應(yīng)用于INSERT和REPLACE語句。當(dāng)DELAYED插入操作到達(dá)的時(shí)候,
服務(wù)器把數(shù)據(jù)行放入一個(gè)隊(duì)列中,并立即給客戶端返回一個(gè)狀態(tài)信息,這樣客戶
端就可以在數(shù)據(jù)表被真正地插入記錄之前繼續(xù)進(jìn)行操作了。如果讀取者從該數(shù)據(jù)
表中讀取數(shù)據(jù),隊(duì)列中的數(shù)據(jù)就會(huì)被保持著,直到?jīng)]有讀取者為止。接著服務(wù)器
開始插入延遲數(shù)據(jù)行(delayed-row)隊(duì)列中的數(shù)據(jù)行。在插入操作的同時(shí),服務(wù)器
還要檢查是否有新的讀取請(qǐng)求到達(dá)和等待。如果有,延遲數(shù)據(jù)行隊(duì)列就被掛起,
允許讀取者繼續(xù)操作。當(dāng)沒有讀取者的時(shí)候,服務(wù)器再次開始插入延遲的數(shù)據(jù)行。
這個(gè)過程一直進(jìn)行,直到隊(duì)列空了為止。
幾點(diǎn)要注意事項(xiàng):
· INSERT DELAYED應(yīng)該僅用于指定值清單的INSERT語句。服務(wù)器忽略用于INSERT DELAYED...SELECT語句的DELAYED。
· 服務(wù)器忽略用于INSERT DELAYED...ON DUPLICATE UPDATE語句的DELAYED。
· 因?yàn)樵谛斜徊迦肭埃Z句立刻返回,所以您不能使用LAST_INSERT_ID()來獲取AUTO_INCREMENT值。AUTO_INCREMENT值可能由語句生成。
· 對(duì)于SELECT語句,DELAYED行不可見,直到這些行確實(shí)被插入了為止。
· DELAYED在從屬復(fù)制服務(wù)器中被忽略了,因?yàn)镈ELAYED不會(huì)在從屬服務(wù)器中產(chǎn)生與主服務(wù)器不一樣的數(shù)據(jù)。
注意,目前在隊(duì)列中的各行只保存在存儲(chǔ)器中,直到它們被插入到表中為止。這意味著,如果您強(qiáng)行中止了mysqld(例如,使用kill -9)
或者如果mysqld意外停止,則所有沒有被寫入磁盤的行都會(huì)丟失。
二、IGNORE的使用
IGNORE是MySQL相對(duì)于標(biāo)準(zhǔn)SQL的擴(kuò)展。如果在新表中有重復(fù)關(guān)鍵字,
或者當(dāng)STRICT模式啟動(dòng)后出現(xiàn)警告,則使用IGNORE控制ALTER TABLE的運(yùn)行。
如果沒有指定IGNORE,當(dāng)重復(fù)關(guān)鍵字錯(cuò)誤發(fā)生時(shí),復(fù)制操作被放棄,返回前一步驟。
如果指定了IGNORE,則對(duì)于有重復(fù)關(guān)鍵字的行,只使用第一行,其它有沖突的行被刪除。
并且,對(duì)錯(cuò)誤值進(jìn)行修正,使之盡量接近正確值。
insert ignore into tb(...) value(...)
這樣不用校驗(yàn)是否存在了,有則忽略,無則添加
三、ON DUPLICATE KEY UPDATE的使用
如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后會(huì)導(dǎo)致在一個(gè)UNIQUE索引或PRIMARY KEY中出現(xiàn)重復(fù)值,則執(zhí)行舊行UPDATE。例如,如果列a被定義為UNIQUE,并且包含值1,則以下兩個(gè)語句具有相同的效果:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
mysql> UPDATE table SET c=c+1 WHERE a=1;
如果行作為新記錄被插入,則受影響行的值為1;如果原有的記錄被更新,則受影響行的值為2。
注釋:如果列b也是唯一列,則INSERT與此UPDATE語句相當(dāng):
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
如果a=1 OR b=2與多個(gè)行向匹配,則只有一個(gè)行被更新。通常,您應(yīng)該盡量避免對(duì)帶有多個(gè)唯一關(guān)鍵字的表使用ON DUPLICATE KEY子句。
您可以在UPDATE子句中使用VALUES(col_name)函數(shù)從INSERT...UPDATE語句的INSERT部分引用列值。換句話說,如果沒有發(fā)生重復(fù)關(guān)鍵字沖突,則UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函數(shù)特別適用于多行插入。VALUES()函數(shù)只在INSERT...UPDATE語句中有意義,其它時(shí)候會(huì)返回NULL。
示例:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
-> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
本語句與以下兩個(gè)語句作用相同:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=3;
mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
-> ON DUPLICATE KEY UPDATE c=9;
當(dāng)您使用ON DUPLICATE KEY UPDATE時(shí),DELAYED選項(xiàng)被忽略。
總結(jié):DELAYED 做為快速插入,并不是很關(guān)心失效性,提高插入性能。
ignore 只關(guān)注主鍵對(duì)應(yīng)記錄是不存在,無則添加,有則忽略。
ON DUPLICATE KEY UPDATE 在添加時(shí)操作,關(guān)注非主鍵列,注意與ignore的區(qū)別。有則更新指定列,無則添加。
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
或:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
或:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
一、DELAYED 的使用
使用延遲插入操作
DELAYED調(diào)節(jié)符應(yīng)用于INSERT和REPLACE語句。當(dāng)DELAYED插入操作到達(dá)的時(shí)候,
服務(wù)器把數(shù)據(jù)行放入一個(gè)隊(duì)列中,并立即給客戶端返回一個(gè)狀態(tài)信息,這樣客戶
端就可以在數(shù)據(jù)表被真正地插入記錄之前繼續(xù)進(jìn)行操作了。如果讀取者從該數(shù)據(jù)
表中讀取數(shù)據(jù),隊(duì)列中的數(shù)據(jù)就會(huì)被保持著,直到?jīng)]有讀取者為止。接著服務(wù)器
開始插入延遲數(shù)據(jù)行(delayed-row)隊(duì)列中的數(shù)據(jù)行。在插入操作的同時(shí),服務(wù)器
還要檢查是否有新的讀取請(qǐng)求到達(dá)和等待。如果有,延遲數(shù)據(jù)行隊(duì)列就被掛起,
允許讀取者繼續(xù)操作。當(dāng)沒有讀取者的時(shí)候,服務(wù)器再次開始插入延遲的數(shù)據(jù)行。
這個(gè)過程一直進(jìn)行,直到隊(duì)列空了為止。
幾點(diǎn)要注意事項(xiàng):
· INSERT DELAYED應(yīng)該僅用于指定值清單的INSERT語句。服務(wù)器忽略用于INSERT DELAYED...SELECT語句的DELAYED。
· 服務(wù)器忽略用于INSERT DELAYED...ON DUPLICATE UPDATE語句的DELAYED。
· 因?yàn)樵谛斜徊迦肭埃Z句立刻返回,所以您不能使用LAST_INSERT_ID()來獲取AUTO_INCREMENT值。AUTO_INCREMENT值可能由語句生成。
· 對(duì)于SELECT語句,DELAYED行不可見,直到這些行確實(shí)被插入了為止。
· DELAYED在從屬復(fù)制服務(wù)器中被忽略了,因?yàn)镈ELAYED不會(huì)在從屬服務(wù)器中產(chǎn)生與主服務(wù)器不一樣的數(shù)據(jù)。
注意,目前在隊(duì)列中的各行只保存在存儲(chǔ)器中,直到它們被插入到表中為止。這意味著,如果您強(qiáng)行中止了mysqld(例如,使用kill -9)
或者如果mysqld意外停止,則所有沒有被寫入磁盤的行都會(huì)丟失。
二、IGNORE的使用
IGNORE是MySQL相對(duì)于標(biāo)準(zhǔn)SQL的擴(kuò)展。如果在新表中有重復(fù)關(guān)鍵字,
或者當(dāng)STRICT模式啟動(dòng)后出現(xiàn)警告,則使用IGNORE控制ALTER TABLE的運(yùn)行。
如果沒有指定IGNORE,當(dāng)重復(fù)關(guān)鍵字錯(cuò)誤發(fā)生時(shí),復(fù)制操作被放棄,返回前一步驟。
如果指定了IGNORE,則對(duì)于有重復(fù)關(guān)鍵字的行,只使用第一行,其它有沖突的行被刪除。
并且,對(duì)錯(cuò)誤值進(jìn)行修正,使之盡量接近正確值。
insert ignore into tb(...) value(...)
這樣不用校驗(yàn)是否存在了,有則忽略,無則添加
三、ON DUPLICATE KEY UPDATE的使用
如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后會(huì)導(dǎo)致在一個(gè)UNIQUE索引或PRIMARY KEY中出現(xiàn)重復(fù)值,則執(zhí)行舊行UPDATE。例如,如果列a被定義為UNIQUE,并且包含值1,則以下兩個(gè)語句具有相同的效果:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
mysql> UPDATE table SET c=c+1 WHERE a=1;
如果行作為新記錄被插入,則受影響行的值為1;如果原有的記錄被更新,則受影響行的值為2。
注釋:如果列b也是唯一列,則INSERT與此UPDATE語句相當(dāng):
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
如果a=1 OR b=2與多個(gè)行向匹配,則只有一個(gè)行被更新。通常,您應(yīng)該盡量避免對(duì)帶有多個(gè)唯一關(guān)鍵字的表使用ON DUPLICATE KEY子句。
您可以在UPDATE子句中使用VALUES(col_name)函數(shù)從INSERT...UPDATE語句的INSERT部分引用列值。換句話說,如果沒有發(fā)生重復(fù)關(guān)鍵字沖突,則UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函數(shù)特別適用于多行插入。VALUES()函數(shù)只在INSERT...UPDATE語句中有意義,其它時(shí)候會(huì)返回NULL。
示例:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
-> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
本語句與以下兩個(gè)語句作用相同:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=3;
mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
-> ON DUPLICATE KEY UPDATE c=9;
當(dāng)您使用ON DUPLICATE KEY UPDATE時(shí),DELAYED選項(xiàng)被忽略。
總結(jié):DELAYED 做為快速插入,并不是很關(guān)心失效性,提高插入性能。
ignore 只關(guān)注主鍵對(duì)應(yīng)記錄是不存在,無則添加,有則忽略。
ON DUPLICATE KEY UPDATE 在添加時(shí)操作,關(guān)注非主鍵列,注意與ignore的區(qū)別。有則更新指定列,無則添加。
您可能感興趣的文章:
相關(guān)文章
MySQL中二進(jìn)制與重做日志文件的基本概念學(xué)習(xí)教程
這篇文章主要介紹了MySQL中二進(jìn)制日志文件與重做日志文件的基本概念學(xué)習(xí)教程,講到了一些重做日志與二進(jìn)制日志的區(qū)別,需要的朋友可以參考下2015-11-11MYSQL事務(wù)教程之Yii2.0商戶提現(xiàn)功能
這篇文章主要給大家介紹了關(guān)于MYSQL事務(wù)教程之Yii2.0商戶提現(xiàn)功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07SELECT INTO 和 INSERT INTO SELECT 兩種表復(fù)制語句簡(jiǎn)單介紹
Insert是T-sql中常用語句,Insert INTO table(field1,field2,...) values(value1,value2,...)這種形式的在應(yīng)用程序開發(fā)中必不可少2012-11-11一條sql詳解MYSQL的架構(gòu)設(shè)計(jì)詳情
這篇文章主要介紹了一條sql詳解MYSQL的架構(gòu)設(shè)計(jì)詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09innodb 庫的備份注意點(diǎn)(由phpmyadmin引起的解決方案)
新版本xampps 1.8.5 X64 集成了phpmyadmin最新版本(4.1.0), 可每次初始化安裝程序后, 進(jìn)入phpmyadmin管理工具, 就會(huì)發(fā)現(xiàn)phpmyadmin高級(jí)功能失效, 一直在提示數(shù)據(jù)表不存在, 經(jīng)過再三的分析, 終于找到原因2013-12-12MySQL 一次執(zhí)行多條語句的實(shí)現(xiàn)及常見問題
通常情況MySQL出于安全考慮不允許一次執(zhí)行多條語句(但也不報(bào)錯(cuò),很讓人郁悶)。2009-08-08MySQL數(shù)據(jù)庫備份恢復(fù)實(shí)現(xiàn)代碼
這篇文章主要介紹了MySQL數(shù)據(jù)庫備份恢復(fù)實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06