zoukankan      html  css  js  c++  java
  • 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.

    ----

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

      

  • 相关阅读:
    3.13作业 制作网页布局
    3.11 框架和样式表
    表单
    3.8学习记录
    第一次作业
    数据库增删改查
    数据库三大范式
    数据库中的时间戳
    数据库的主键与外键
    登录页面
  • 原文地址:https://www.cnblogs.com/cbza/p/6913411.html
Copyright © 2011-2022 走看看