国外做汽配的网站,wordpress文件上传 并发,上海建设网站费用,北京建站公司INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO#xff0c;两个命令可以处理重复键值问题#xff0c;在实际上它之间有什么区别呢#xff1f;前提条件是这个表必须有一个唯一索引或主键。1、REPLACE发现重复的先删除再插入#xff0c;如果记录有多个字段#xff0c…INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO两个命令可以处理重复键值问题在实际上它之间有什么区别呢前提条件是这个表必须有一个唯一索引或主键。1、REPLACE发现重复的先删除再插入如果记录有多个字段在插入的时候如果有的字段没有赋值那么新插入的记录这些字段为空。2、INSERT发现重复的是更新操作。在原有记录基础上更新指定字段内容其它字段内容保留。这样REPLACE的操作成本要大于 insert ON DUPLICATE KEY UPDATE. 按照 odds 的 代码 按道理应该选用insert ON DUPLICATE KEY UPDATE部分测试如下2个 都是 影响的数据栏: 2时间: 0.000msmysql insert的几点操作(DELAYED 、IGNORE、ON DUPLICATE KEY UPDATE )INSERT语法INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_nameexpr, ... ]或INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name SET col_name{expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col_nameexpr, ... ]或INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] SELECT ... [ ON DUPLICATE KEY UPDATE col_nameexpr, ... ]一、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 cc1;mysql UPDATE table SET cc1 WHERE a1;如果行作为新记录被插入则受影响行的值为1如果原有的记录被更新则受影响行的值为2。注释如果列b也是唯一列则INSERT与此UPDATE语句相当mysql UPDATE table SET cc1 WHERE a1 OR b2 LIMIT 1;如果a1 OR b2与多个行向匹配则只有一个行被更新。通常您应该尽量避免对带有多个唯一关键字的表使用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 cVALUES(a)VALUES(b);本语句与以下两个语句作用相同mysql INSERT INTO table (a,b,c) VALUES (1,2,3) - ON DUPLICATE KEY UPDATE c3;mysql INSERT INTO table (a,b,c) VALUES (4,5,6) - ON DUPLICATE KEY UPDATE c9;当您使用ON DUPLICATE KEY UPDATE时DELAYED选项被忽略。总结DELAYED 做为快速插入并不是很关心失效性提高插入性能。 ignore 只关注主键对应记录是不存在无则添加有则忽略。 ON DUPLICATE KEY UPDATE 在添加时操作关注非主键列注意与ignore的区别。有则更新指定列无则添加。posted on 2008-08-22 14:17 鱼有所思 阅读(3997) 评论(1) 编辑 收藏 引用 网摘 所属分类: MySQL评论:# MySQL INSERT ... ON DUPLICATE KEY UPDATE 2008-08-22 14:26 | 鱼有所思INSERT ... ON DUPLICATE KEY UPDATE当插入的记录会引发主键冲突或者违反唯一约束时则使用UPDATE更新旧的记录否则插入新记录。mysql desc test;-----------------------------------------------| Field | Type | Null | Key | Default | Extra |-----------------------------------------------| uid | int(11) | NO | PRI | | || uname | varchar(20) | YES | | NULL | |-----------------------------------------------2 rows in set (0.00 sec)mysql select * from test;-------------| uid | uname |-------------| 1 | uname1 || 2 | uname2 || 3 | me |-------------3 rows in set (0.00 sec)mysql INSERT INTO test values ( 3,insertName )- ON DUPLICATE KEY UPDATE unameupdateName;Query OK, 2 rows affected (0.03 sec)mysql select * from test;-----------------| uid | uname |-----------------| 1 | uname1 || 2 | uname2 || 3 | updateName |-----------------3 rows in set (0.00 sec)mysql create index i_test_uname on test(uname);Query OK, 3 rows affected (0.20 sec)Records: 3 Duplicates: 0 Warnings: 0mysql INSERT INTO test VALUES ( 1 , uname2) - ON DUPLICATE KEY UPDATE unameupdate2records;Query OK, 2 rows affected (0.00 sec)mysql select * from test;---------------------| uid | uname |---------------------| 2 | uname2 || 1 | update2records || 3 | updateName |---------------------3 rows in set (0.00 sec)插入时会与两条记录发生冲突分别由主键和唯一索引引起。但最终只UPDATE了其中一条。这在手册中也说明了有多个唯一索引或者有键也有唯一索引的情况下不建议使用该语句。