需求:

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. day1-6 字符串、列表、元组、字典、类型转换

    day1 1.python历史. 宏观上:python2 与 python3 区别: python2 源码不标准,混乱,重复代码太多, python3 统一 标准,去除重复代码. 2.python的环 ...

  2. leetcode-algorithms-32 Longest Valid Parentheses

    leetcode-algorithms-32 Longest Valid Parentheses Given a string containing just the characters '(' a ...

  3. Wannafly挑战赛22-A/B/C

    链接:https://www.nowcoder.com/acm/contest/160/A来源:牛客网 题目描述 有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,a ...

  4. python 小练习2

    给你一个整数列表L,判断L中是否存在相同的数字, 若存在,输出YES,否则输出NO.解1l=[]for i in L:    if L.count(i) != 1:        print('YES ...

  5. server library[unbound] 服务未绑定解决办法

    情景如下:

  6. [LeetCode] 96. Unique Binary Search Trees(给定一个数字n,有多少个唯一二叉搜索树) ☆☆☆

    [Leetcode] Unique binary search trees 唯一二叉搜索树 Unique Binary Search Trees leetcode java 描述 Given n, h ...

  7. ActiveMQ producer 提交事务时突然宕机,会发生什么

    producer 在提交事务时,发生宕机,commit 的命令没有发送到 broker,这时会发生什么? ActiveMQ 开启事务发送消息的步骤: session.getTransactionCon ...

  8. TLS 改变密码标准协议(Change Cipher Spec Protocol) 就是加密传输中每隔一段时间必须改变其加解密参数的协议

    SSL修改密文协议的设计目的是为了保障SSL传输过程的安全性,因为SSL协议要求客户端或服务器端每隔一段时间必须改变其加解密参数.当某一方要改变其加解密参数时,就发送一个简单的消息通知对方下一个要传送 ...

  9. 使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程(十五)

    在之前的所有Spring Boot和Spring Cloud相关博文中,都会涉及Spring Boot工程的创建.而创建的方式多种多样,我们可以通过Maven来手工构建或是通过脚手架等方式快速搭建,也 ...

  10. 通过css 实现“瀑布流”

    .hot_list{-webkit-column-count: 2; -moz-column-count: 2; column-count: 2; -moz-column-gap:7px; -webk ...