设为首页 - 加入收藏 - 网站地图 欢迎加QQ群 :14364084
当前位置:谭博的博客 > 数据库 > mysql > 正文

mysql :INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO的区别

时间:2013-03-03 18:07 来源: 标签:mysql ON DUPLICATE KEY UPDATE REPLACE INTO 作者:谭博 阅读:
INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO,两个命令可以处理重复键值问题,在实际上它之间有什么区别呢?
前提条件是这个表必须有一个唯一索引或主键。1、REPLACE发现重复的先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空。
2、INSERT发现重复的是更新操作。在原有记录基础上,更新指定字段内容,其它字段内容保留。
 
个人觉得INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO相比较只适用于单条记录操作,因为REPLACE INTO适用于将一个表的数据插入到另一个表,INSERT INTO ON DUPLICATE KEY UPDATE 没发现类型功能,
 

例如ipstats表结构如下:

CREATE TABLE ipstats (

ip VARCHAR(15)NOT NULLUNIQUE,

clicks SMALLINT(5)UNSIGNEDNOT NULLDEFAULT’0′

);

原本需要执行3条SQL语句,如下:

IF(SELECT * FROM ipstats WHERE ip=’192.168.0.1′){

UPDATE ipstats SET clicks=clicks+1WHERE ip=’192.168.0.1′;

}  else  {

INSERTINTO ipstats (ip, clicks)VALUES(’192.168.0.1′, 1);

}

而现在只需下面1条SQL语句即可完成:

INSERTINTO ipstats VALUES(’192.168.0.1′, 1) ON DUPLICATE KEY UPDATE clicks=clicks+1;

注意,要使用这条语句,前提条件是这个表必须有一个唯一索引或主键。

再看一例子:
mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| uid   | int(11)     | NO   | PRI |         |       |
| uname | varchar(20) | YES |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
 
mysql> select * from test;
+-----+--------+
| uid | uname |
+-----+--------+
|   1 | uname1 |
|   2 | uname2 |
|   3 | me     |
+-----+--------+

 

mysql> INSERT INTO test values ( 3,’insertName’ ) ON DUPLICATE KEY UPDATE uname=’updateName’;

mysql> select * from test;
+-----+------------+
| uid | uname      |
+-----+------------+
|   1 | uname1     |
|   2 | uname2     |
|   3 | updateName |
+-----+------------+

mysql> create index i_test_uname on test(uname);

mysql> INSERT INTO test VALUES ( 1 , ‘uname2′) ON DUPLICATE KEY UPDATE uname=’update2records’;

mysql> select * from test;
+-----+----------------+
| uid | uname          |
+-----+----------------+
|   2 | uname2         |
|   1 | update2records |
|   3 | updateName     |
+-----+----------------+

插入时会与两条记录发生冲突,分别由主键和唯一索引引起。但最终只UPDATE了其中一条。这在手册中也说明了,有多个唯一索引(或者有键也有唯一索引)的情况下,不建议使用该语句。

 

关注微信公众号

微信扫一扫,打赏我

热评文章
    内容不错,支持一下
    评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
    • 游客
      2014-06-22 08:10:41发表

      pAlso, sie kouml;nnen auch uuml;bersiedeln from einwohnen Sie zu einem anderen, bis sie sind, at kehren Sie zuruuml;ck.?.Make sicher zuplanen Sie Ihre Zukunft much likedie gegebenen Vorschlauml;ge in t