mysql ON DUPLICATE KEY UPDATE ; 以及 同replace to 的区别.

需求:

     1)如果admin表中没有数据, 插入一条

  2)如果admin表中有数据, 不插入.

一般做法:

 1     if($result = mysql_query("select * from admin"))
 2     {
 3         if(mysql_num_rows($result))
 4         {
 5             echo "<br/>admin表中已经有数据了";
 6         }
 7         else
 8         {
 9             $sql = " insert into admin (`adminName`, `password`, `lastUpdateTime`) values('admin', '1234.asd', " .time(). ")";
10             if(mysql_query($sql))
11             {
12                 echo "<br/>admin表中插入一条信息成功";
13             }
14             else
15             {
16                 echo "<br/>admin表中插入一条信息失败";
17             }
18         }
19     }

如果用一条sql语句.

INSERT INTO admin (`id`, `adminName`, `password`, `lastUpdateTime`) VALUES (1,'admin', '1234.asd',1495871878) ON DUPLICATE KEY UPDATE `password` = '1234.asd'

这里 id 是 主键 . 插入的数据必须包含主键 .

第一次执行: 插入一条数据, 影响一行

第二次执行: 发现有重复的值,执行update操作, 但是设置的password仍然相同, 因此update操作停止, 影响 0行.

上面设置 插入id不是普遍情况, 更多的是保持其他字段唯一的.

参考:

深入mysql "ON DUPLICATE KEY UPDATE" 语法的分析  

 

ON DUPLICATE KEY UPDATE ; 以及 同replace to 的区别.

同上面的例子不同. 我们设置 admin表中  的 adminName 为唯一 索引:

 ----------

1: insert into

执行: 增加一个同名用户 admin , 同时 密码变为 test1

INSERT INTO admin (`adminName` , `password`, `lastUpdateTime`) VALUES ('admin', 'test1', NOW());

2:执行:replace

添加一个同名用户 admin, 同时密码是test1

REPLACE INTO admin (`adminName` , `password`, `lastUpdateTime`) VALUES ('admin', 'test1', NOW());

上面 原来的id为 4 的记录 被删除了, 增加了一条新的记录.

replace into 的逻辑是:

如果有重复的, 就删掉一条,再重新 新增一条.

-----------

3: insert into  on duplicate key update

添加一个同名用户admin ,密码为 test2.

 1 INSERT INTO admin (`adminName`, `password`, `lastUpdateTime`) VALUES ('admin', 'test2',NOW()) ON DUPLICATE KEY UPDATE `password` = 'test2' 

更好的写法:

 1 INSERT INTO admin (`adminName`, `password`, `lastUpdateTime`) VALUES ('admin', 'test2',NOW()) ON DUPLICATE KEY UPDATE `password` = VALUES(`password`); 

这段代码的意思就是:

1)向 表admin 中插入一条数据 名字是 admin, 密码是 test2

    1-1)如果 admin这个名字没有重复, 那么就是新增加一条记录, 主键id 增加1;

 1-2)如果 admin这个名字已经存在,那么执行update操作, 将已经存在的admin的密码更新为 test2 . 主键id不变

上面虽然影响的是2行 ,

但是 原来的第2歩操作后的 id是 5, 进行第3歩操作后, id仍然是 5 ,没有变 ; 同时 密码 被更新为 test2 .

-------------------

如果 a,b ,c 两个字段 , a 设置为 唯一.

数据库中存在:

a    b    c 

1    2    3

2    3    4

3     4   5

4   5     6

---

执行  insert into 表1 (a, b ,c ) values(1, 2, 4 ) on duplicate key update c = c +4;

此时 是在原来的c 的基础之上 加上 4 , 就是 c = 3 + 4;

---

执行 insert into 表1 (a, b ,c ) values(1, 2, 4 ) on duplicate key update c = VALUES(c);

此时 , c就等于 你要更新的 c ,  c = 4.

----

还有一次插入多个值的情况, 参考上面的链接.

  

原文地址:https://www.cnblogs.com/cbza/p/6913411.html