MySQL replace into 说明(insert into 增强版)
MySQL replace into 说明(insert into 增强版)
在插入数据到一个表时,通常是这种情况:1. 先推断数据是否存在; 2. 假设不存在,则插入;3.假设存在,则更新。
在 SQL Server 中能够这样处理:
if not exists (select 1 from t where id = 1)
insert into t(id, update_time) values(1, getdate())
else
update t set update_time = getdate() where id = 1
那么 MySQL 中怎样实现这种逻辑呢?别着急!
MySQL 中有更简单的方法:
replace into
replace into t(id, update_time) values(1, now());
或
replace into t(id, update_time) select 1, now();
replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中。 1. 假设发现表中已经有此行数据(依据主键或者唯一索引推断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。
要注意的是:插入数据的表必须有主键或者是唯一索引。否则的话,replace into 会直接插入数据,这将导致表中出现反复的数据。
MySQL replace into 有三种形式:
1. replace into tbl_name(col_name, ...) values(...)
2. replace into tbl_name(col_name, ...) select ...
3. replace into tbl_name set col_name=value, ...
前两种形式用的多些。当中 “into” keyword能够省略,只是最好加上 “into”。这样意思更加直观。
另外。对于那些没有给予值的列。MySQL 将自己主动为这些列赋上默认值。
replace具体说明:
參考资料:http://dev.mysql.com/doc/refman/5.0/en/replace.html
REPLACE
作品全然一样 的INSERT
,但假设旧表中的行具有同样的值作为一个新行 PRIMARY
或
KEYUNIQUE
索引。旧行插入新行之前删除。请參见 第13.2.5节,“INSERT语法”。
REPLACE
是一个MySQL扩展SQL标准。它要么插入或删除 和插入。还有一个MySQL扩展到标准的SQL。要么插入或 更新 -请參阅 第13.2.5.3,“INSERT
... ON DUPLICATE KEY UPDATE的SQL语法”。
请注意。除非表有一个PRIMARY
或
KEYUNIQUE
索引。使用 REPLACE
语句是没有意义的。
它变成相当于INSERT
,由于要使用没有索引,以确定新的行是否会复制另外一个。
值的全部列都来自于指定的值 REPLACE
语句。
不论什么缺失的列被设置为各自的默认值,就像发生在 INSERT
。您不能从当前行參考值,并使用他们的新行。
假设您使用的作业,如设置
,參考列名在右边被视为 COL_NAME
= COL_NAME
+1默认(
,所以转让相当于COL_NAME
)SET
。COL_NAME
=
DEFAULT(COL_NAME
)+1
要使用REPLACE
,您必须同一时候拥有INSERT
和 DELETE
的表的权限。
在REPLACE
语句返回一个数来表示受影响的行数。
这是删除和插入的行的总和。
假设计数1为单排 更换
,连续被插入并没有行被删除。
假设计数插入新行之前大于1。一个或多个旧行被删除。
这是可能的单行替换多个旧行假设表包括多个唯一索引,而且新行复制的值在不同的唯一索引中的不同旧行。
受影响的行数能够非常easy地确定是否 REPLACE
仅仅加入了一行。或者是否也换成不论什么行:检查是否计数1(加入)或更大(替换)。
假设您正在使用C
API时,受影响的行数能够通过获得 mysql_affected_rows()
函数。
眼下,您不能更换成一个表,并从同一个表中的子查询中选择。
MySQL使用下列算法 REPLACE
(和LOAD
):
DATA ... REPLACE
尝试插入新行插入表
而插入失败。由于发生在主键或唯一索引的反复键错误:
从表中删除了反复的键值冲突的行
再次尝试插入新行插入表
可能的是在一个反复键错误的情况下,存储引擎能够运行REPLACE
作为更新,而不是删除加插入,但语义是同样的。有没有比方何存储引擎添加一个可能的差异其它用户可见的效果 Handler_
状态变量。XXX
版权声明:本文博客原创文章。博客,未经同意,不得转载。
最新文章
- 黑马程序员+ADO.Net基础(下)
- javascript:算法之斐波那契数列
- CentOS 7数据库mysql和mariadb手动安装冲突的问题解决
- lua脚本教程
- 如何让Form窗体接收KeyDown事件?
- Setup Entity Framework Environment
- 深度分析Java的ClassLoader机制(源码级别)
- APK签名校验绕过
- 【用PS3手柄在安卓设备上玩游戏系列】FC(任天堂NES/FC主机)模拟器
- jumpserver安装
- 微信小程序滚动Tab选项卡:左右可滑动切换
- kvm日常维护
- psdTohtml
- redis-4.0.11主从配置初步探究
- Maven的配置指南
- Hugepage介绍以及实践
- 基于easyui开发Web版Activiti流程定制器详解(五)——Draw2d详解(一)
- jquery中的data-icon和data-role
- com.mysql.jdbc.MysqlDataTruncation: Data trunca...
- 只安装自己需要的Office2016组件的方法
热门文章
- Codeforces Round #267 (Div. 2) A
- Duanxx的STM32学习:STM32F103中等容量的功能和外设
- 房费制VB版本(一个)——系统分析
- Javascript中的深拷贝和浅拷贝
- 关于接收POST请求 $GLOBALS['HTTP_RAW_POST_DATA']
- Unity3D流行的游戏开发人员构建高速检查站系统
- windows平台下载android源代码
- [置顶] 纯手工打造漂亮的瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox!
- WebApi的一种集成测试写法(in-memory)
- 通过HttpClient来调用Web Api接口,实体参数的传递