需求:

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

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

一般做法:

     if($result = mysql_query("select * from admin"))
{
if(mysql_num_rows($result))
{
echo "<br/>admin表中已经有数据了";
}
else
{
$sql = " insert into admin (`adminName`, `password`, `lastUpdateTime`) values('admin', '1234.asd', " .time(). ")";
if(mysql_query($sql))
{
echo "<br/>admin表中插入一条信息成功";
}
else
{
echo "<br/>admin表中插入一条信息失败";
}
}
}

如果用一条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.

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

更好的写法:

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.

----

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

  

mysql ON DUPLICATE KEY UPDATE ; 以及 同replace to 的区别.的更多相关文章

  1. mysql ON DUPLICATE KEY UPDATE 与 REPLACE INTO 的区别

    #mysql ON DUPLICATE KEY UPDATE 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY ...

  2. 深入mysql “ON DUPLICATE KEY UPDATE” 语法的分析

    本篇文章是对mysql “ON DUPLICATE KEY UPDATE”语法进行了详细的分析介绍,需要的朋友参考下. mysql “ON DUPLICATE KEY UPDATE” 语法 如果在IN ...

  3. mysql ON DUPLICATE KEY UPDATE、REPLACE INTO

    INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO,两个命令可以处理重复键值问题,在实际上它之间有什么区别呢?前提条件是这个表必须有一个唯一索引或主键 ...

  4. MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.

    mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...

  5. mysql ON DUPLICATE KEY UPDATE重复插入时更新

    mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (c ...

  6. MySQL on duplicate key update 批量插入并更新已存在数据

    业务上经常存在一种现象,需要批量往表中插入多条数据,但在执行过程中,很可能因为唯一键冲突,而导致批量插入失败.因此需要事先判断哪些数据是重复的,哪些是新增的.比较常用的处理方法就是找出已存在的数据,并 ...

  7. 深入mysql "on duplicate key update" 语法的分析

    如果在INSERT语句末尾指定了on duplicate key update,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不 ...

  8. mysql "ON DUPLICATE KEY UPDATE" 语法

    如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不 ...

  9. MySQL: ON DUPLICATE KEY UPDATE 用法 避免重复插入数据

    INSERT INTO osc_visit_stats(stat_date,type,id,view_count) VALUES (?,?,?,?) ON DUPLICATEKEY UPDATE vi ...

随机推荐

  1. 反射API(一)

    <?php function classData(ReflectionClass $class) { echo '<hr>'; $details = '当前文件:'; $detail ...

  2. 2.4 UML类图

    类图定义 类class的定义 具有相同属性.操作.方法.关系或者行为的一组对象的描述符 类是真实世界事物的抽象 问题领域的类:在对系统建模时,将会涉及到如何识别业务系统中的事物,这些事物构 成了整个业 ...

  3. Financiers Game CodeForces - 737D (博弈论)

    直接暴力区间DP的话是$O(n^3)$, 关键注意到每步走的距离差不超过1, 所以差最大是$O(\sqrt{n})$的, 所以实际上有用的状态是$O(n^2)$的, 可以通过.

  4. CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout的用法,让Toolbar与系统栏融为一体

    CoordinatorLayout其实是加强版的FrameLayout布局,可以监听期所有子控件的各种事件,由Design Support库提供的,能体现Material Design 的魔力.能解决 ...

  5. git clone项目

    1. 生成公钥和私钥 ssh-keygen 2. 将公钥添加到github或者gitlab上,一般github或者gitlab允许添加多个公钥,可能是考虑到用户使用不同的机器了吧,还是很贴心的. 3. ...

  6. 深入Spring Boot: 怎样排查 java.lang.ArrayStoreException

    java.lang.ArrayStoreException 分析 这个demo来说明怎样排查一个spring boot 1应用升级到spring boot 2时可能出现的java.lang.Array ...

  7. webapp检测安卓app是否安装并launch

    1. cordova插件 1)查看所有已安装的安卓app https://www.npmjs.com/package/cordova-plugin-packagemanager A simple pl ...

  8. openfiler简介

    Openfiler 1.        简介 Openfiler可以将一个工业标准的X86_64的架构系统转换为一个完全成熟的NAS/SAN存储设备或IP存储路由,并为存储管理者提供一个解决正快速成长 ...

  9. 批量生成QRcode

    本想在excel批量生成GUID,并生成二维码. //Excel生成guid,uuid 格式:600d65bc-948a---fd8dfeebb1cd =LOWER(CONCATENATE(DEC2H ...

  10. python http 请求 响应 post表单提交

    1. 查看请求 响应情况 print(response.text) print(response.headers) print(response.request.body) print(respons ...