本文纯属个人见解,是对前面学习的结总,如有描述不准确的地方还请高手指正~
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的区分。有则更新指定列,无则添加。
文章结束给大家分享下程序员的一些笑话语录: 有一天,一个男人穿越森林的时候,听到一个细微的声音叫住他。他低头一看,是一只青蛙。
“如果你亲我一下,我会变成一个美丽的公主哦。”男人一言不发,把青蛙捡起来,放入口袋。
“如果你亲我一下,我会变成一个美丽的公主哦。而且,我会告诉我遇到的每一个人,你是多么聪明和勇敢,你是我的英雄。”男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一星期。”男人又把青蛙拿出来,对着它微微一笑,把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一年,而且你可以对我做任何事。”再一次,男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
最后,青蛙无力地问:“我开出了这么好的条件,为什么你还不肯吻我?”男人说:“我是一个程序员,我可没时间和什么公主鬼混。不过,拥有一个会说话的青蛙,倒是蛮酷的。”