需求:

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. 【洛谷p1403 】【AHOI2005】约数研究

    (有种失踪人口回归的感觉) 约束研究[传送门] (不过好像没有人注意到我这个蒟蒻) 好的不管它啦 最近学数论比较多,所以可能会有好多好多的数论题???(不存在的) 行吧上算法标签: 数论   数论  ...

  2. POJ No.2386 Lake Counting

    题目链接:http://poj.org/problem?id=2386 分析:八联通的则为水洼,我们则需遍历一个单位附近的八个单位并将它们都改成'.',但附近单位可能仍连接着有'W'的区域,这种情况下 ...

  3. 【PowerDesigner】【7】Table视图显示Comment

    原理:把显示name的列的值,替换成注释的值. 步骤:打开菜单Tools>Execute Commands>Edit/Run Script.. 或者用快捷键 Ctrl+Shift+X.将下 ...

  4. 安卓——implements——OnClickListener

    //实现底部的按钮激活监听 设置不同src class click implements OnClickListener{ @Override public void onClick(View v) ...

  5. SET构造函数

    set<int,greater<int>> S; 可以在第二个参数位置设置比较模板,效果和sort类似,less表示升序,greater表示降序.这样做的好处是为了方便应对题目 ...

  6. Oracle Shared Pool之Library Cache

    1. Shared Pool组成 Shared Pool由许多区间(Extent)组成,这些区间又由多个连续的内存块(Chunk)组成,这些内存块大小不一.从逻辑功能角度,Shared pool主要包 ...

  7. 更改Linux语言环境

    查看本地语言环境 locale 中文环境: export LC_ALL=zh_CN.UTF- 英文环境:export LC_ALL=en_US.UTF-8 具体设置其他环境百度...

  8. 解决libvlc_media_player_stop时死锁的方法

    转自:http://www.jiazi.cn/blog/?id=56 扩散该解决方法 最近需要使用VLC控件来做一个简单的流媒体播放器,在实施过程中,发现在调用libvlc_media_player_ ...

  9. Springboot+Mybatis批量导入多条数据

    在Mapper.xml最下面填写 <!-- 批量插入生成的兑换码 --> <insert id ="insertCodeBatch" parameterType= ...

  10. 整合SpringDataJPA

    JPA:ORM(Object Relational Mapping); 1).编写一个 实体类(bean)和数据表进行映射,并且配置好映射 关系: /** * Created by windMan o ...