本文純屬個人見解,是對前面學習的結總,如有描述不準確的地方還請高手指正~
????
mysql insert作操詳解
????
INSERT法語:
????
INSERT [LOW_PRIORITY |DELAYED| HIGH_PRIORITY] [IGNORE]
????
[INTO]tbl_name[(col_name,...)]
????
VALUES ({expr| DEFAULT},...),(...),...
????
[ON DUPLICATE KEY UPDATEcol_name=expr, ... ]
????
或:
????
INSERT [LOW_PRIORITY |DELAYED| HIGH_PRIORITY] [IGNORE]
????
[INTO]tbl_name
????
SETcol_name={expr| DEFAULT}, ...
????
[ON DUPLICATE KEY UPDATEcol_name=expr, ... ]
????
或:
????
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
????
[INTO]tbl_name[(col_name,...)]
????
SELECT ...
????
[ON DUPLICATE KEY UPDATEcol_name=expr, ... ]
????
一、DELAYED的應用
????
應用延遲插入作操
????
DELAYED調節符應于用INSERT和REPLACE語句。當DELAYED插入作操達到的時候,服務器把據數行放入一個隊列中,并當即給客戶端返回一個態狀信息,這樣客戶端以可就在據數表被真正地插入錄記之前續繼停止作操了。如果讀取者從該據數表中讀取據數,隊列中的據數就會被保持著,直到沒有讀取者為止。接著服務器開始插入延遲據數行(delayed-row)隊列中的據數行。在插入作操的同時,服務器還要檢查是不是有新的讀取請求達到和待等。如果有,延遲據數行隊列就被掛起,答應讀取者續繼作操。當沒有讀取者的時候,服務器再次開始插入延遲的據數行。這個程過直一停止,直到隊列空了為止。
????
幾點要注意事項:
????
· INSERT DELAYED該應僅于用指定值清單的INSERT語句。服務器疏忽于用INSERT DELAYED...SELECT語句的DELAYED。
????
· 服務器疏忽于用INSERT DELAYED...ON DUPLICATE UPDATE語句的DELAYED。
????
· 因為行在被插入前,語句立刻返回,所以您不能應用LAST_INSERT_ID()來獲得AUTO_INCREMENT值。AUTO_INCREMENT值可能由語句生成。
????
· 對于SELECT語句,DELAYED行可不見,直到這些行確切被插入了為止。
????
· DELAYED在屬從制復服務器中被疏忽了,因為DELAYED不會在屬從服務器中發生與主服務器不一樣的據數。
????
注意,前目在隊列中的各行只保存在存儲器中,直到它們被插入到表中為止。這意味著,如果您強行止中了MySQLd(例如,應用kill -9)或者如果mysqld不測停止,則全部沒有被寫入磁盤的行會都喪失。
????
二、IGNORE的應用
????
IGNORE是MySQL于對相標準SQL的擴展。如果在新表中有復重關鍵字,或者當STRICT式模啟動后涌現告警,則應用IGNORE制控ALTER TABLE的行運。如果沒有指定IGNORE,當復重關鍵字錯誤發生時,制復作操被棄放,返回前一驟步。如果指定了IGNORE,則對于有復重關鍵字的行,只應用第一行,其它有沖突的行被除刪。并且,對錯誤值停止修正,使之盡量親近準確值。
????
?
????
insert ignore into tb(...) value(...)
????
這樣不必校驗是不是存在了,有則疏忽,無則添加。
????
三、 ON DUPLICATE KEY UPDATE的應用
????
如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后會致導在一個UNIQUE索引或PRIMARY KEY中涌現復重值,則執行舊行UPDATE。例如,如果列a被義定為UNIQUE,并且含包值1,則以下兩個語句擁有雷同的果效: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語句當相:
????
mysql>UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
????
如果a=1 OR b=2與多個行向匹配,則只有一個行被更新。平日,您該應盡量免避對帶有多個一唯關鍵字的表應用ON DUPLICATE KEY句子。
????
您可以在UPDATE句子中應用VALUES(col_name)數函從INSERT...UPDATE語句的INSERT分部引用列值。換句話說,如果沒有發生復重關鍵字沖突,則UPDATE句子中的VALUES(col_name)可以引用被插入的col_name的值。本數函別特適于用多行插入。VALUES()數函只在INSERT...UPDATE語句中有意思,其它時候會返回NULL。
????
示例:
????
mysql>INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
????
->ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
????
本語句與以下兩個語句作用雷同:
????
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;
????
當您應用ON DUPLICATE KEY UPDATE時,DELAYED選項被疏忽。
????
結總:DELAYED 做為倏地插入,是不并很關懷失效性,進步插入性能。
????
ignore 只存眷主鍵對應錄記是不存在,無則添加,有則疏忽。
????
ON DUPLICATE KEY UPDATE 在添加時作操,存眷非主鍵列,注意與ignore的區分。有則更新指定列,無則添加。
文章結束給大家分享下程序員的一些笑話語錄: 有一天,一個男人穿越森林的時候,聽到一個細微的聲音叫住他。他低頭一看,是一只青蛙。
“如果你親我一下,我會變成一個美麗的公主哦。”男人一言不發,把青蛙撿起來,放入口袋。
“如果你親我一下,我會變成一個美麗的公主哦。而且,我會告訴我遇到的每一個人,你是多么聰明和勇敢,你是我的英雄。”男人把青蛙拿出來,對著它微微一笑,又把它放回口袋。
“如果你親我一下,我會變成一個美麗的公主,然后我愿意成為你的愛人一星期。”男人又把青蛙拿出來,對著它微微一笑,把它放回口袋。
“如果你親我一下,我會變成一個美麗的公主,然后我愿意成為你的愛人一年,而且你可以對我做任何事。”再一次,男人把青蛙拿出來,對著它微微一笑,又把它放回口袋。
最后,青蛙無力地問:“我開出了這么好的條件,為什么你還不肯吻我?”男人說:“我是一個程序員,我可沒時間和什么公主鬼混。不過,擁有一個會說話的青蛙,倒是蠻酷的。”
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
