mysql ON DUPLICATE KEY UPDATE ; 以及 同replace to 的区别.
需求:
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 的区别.的更多相关文章
- mysql ON DUPLICATE KEY UPDATE 与 REPLACE INTO 的区别
#mysql ON DUPLICATE KEY UPDATE 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY ...
- 深入mysql “ON DUPLICATE KEY UPDATE” 语法的分析
本篇文章是对mysql “ON DUPLICATE KEY UPDATE”语法进行了详细的分析介绍,需要的朋友参考下. mysql “ON DUPLICATE KEY UPDATE” 语法 如果在IN ...
- mysql ON DUPLICATE KEY UPDATE、REPLACE INTO
INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO,两个命令可以处理重复键值问题,在实际上它之间有什么区别呢?前提条件是这个表必须有一个唯一索引或主键 ...
- MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.
mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...
- mysql ON DUPLICATE KEY UPDATE重复插入时更新
mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (c ...
- MySQL on duplicate key update 批量插入并更新已存在数据
业务上经常存在一种现象,需要批量往表中插入多条数据,但在执行过程中,很可能因为唯一键冲突,而导致批量插入失败.因此需要事先判断哪些数据是重复的,哪些是新增的.比较常用的处理方法就是找出已存在的数据,并 ...
- 深入mysql "on duplicate key update" 语法的分析
如果在INSERT语句末尾指定了on duplicate key update,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不 ...
- mysql "ON DUPLICATE KEY UPDATE" 语法
如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不 ...
- MySQL: ON DUPLICATE KEY UPDATE 用法 避免重复插入数据
INSERT INTO osc_visit_stats(stat_date,type,id,view_count) VALUES (?,?,?,?) ON DUPLICATEKEY UPDATE vi ...
随机推荐
- 微信小程序页面内转发 按钮 转发
通过给 button 组件设置属性 open-type="share",可以在用户点击按钮后触发 Page.onShareAppMessage() 事件,如果当前页面没有定义此事件 ...
- 重写TreeMap的compare方法处理配置表
需要处理的配置表如下: 接上一篇的优化,接着优化,优化代码如下: 这段代码的关键在于重写TreeMap的compare方法. 关于如何重写TreeMap的compare方法,以及返回值代表的意义,可 ...
- Loadrunner打不开浏览器以及卡死的各种问题
Loadrunner11.0启动WebTours之总结1 第一次安装LR11时,安装安组件后没有对电脑进行重启,直接安装的LR112 安装完毕LR后,录制脚本时发现不能启动IE11.百度发现LR支持I ...
- shiro中拦截器机制
8.1 拦截器介绍 Shiro使用了与Servlet一样的Filter接口进行扩展:所以如果对Filter不熟悉可以参考<Servlet3.1规范>http://www.iteye.com ...
- verilog的移位运算符(存在不公平现象)
从上面的例子可以看出,start在移过两位以后,用0来填补空出的位.进行移位运算时应注意移位前后变量的位数,下面举例说明. 4’b1001<<1 = 5’b10010; //左移1位后用0 ...
- Oracle 聚合函数
聚合函数: SQL中提供的聚合函数可以用来统计.求和.求最值等等. 此处采用Oracle 11g中其他用户SCOTT中的EMP表,进行演示. –COUNT:统计行数量 COUNT(*)统计的是结果集的 ...
- 实战dataguard主从切换
前言: 众所周知DataGuard一般的切换分成两种,一种是系统正常的情况下的切换这种方式为:switchover是无损切换,不会丢失数据:另外一种方式属于灾难情况下的切换,这种情况下一般主库已经启动 ...
- log4j的一些参数说明
参数 说明 例子 %c 列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间 log4j配置文件参数举例 输出显示媒介 假设当前logger名字空间 ...
- excel导入 导出
PHP页面 //设置header header("content-Type:text/html;charset=utf-8"); //设置文件大小的限制 ini_set(" ...
- 【Java】XML
一.XML XML(Extensible Markup Language),可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言. 格式: <?xml version="1. ...