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
版权声明:本文博客原创文章。博客,未经同意,不得转载。
MySQL replace into 说明(insert into 增强版)的更多相关文章
- MySQL replace into (insert into 的增强版)
在使用SQL语句进行数据表插入insert操作时,如果表中定义了主键,插入具有相同主键的记录会报错: Error Code: 1062. Duplicate entry 'XXXXX' for ke ...
- MySQL replace into 与insert into
https://blog.csdn.net/helloxiaozhe/article/details/77427266 使用replace带来的问题 1.Replace into 操作在唯一键重复情况 ...
- MySQL replace into 用法(insert into 的增强版)
转 http://blog.csdn.net/risingsun001/article/details/38977797 MySQL replace into 用法(insert into 的增强版) ...
- 将表里的数据批量生成INSERT语句的存储过程 增强版
将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...
- mysql插入数据时 insert IGNORE、ON DUPLICATE KEY UPDATE、replace into
转: mysql insert时几个操作DELAYED .IGNORE.ON DUPLICATE KEY UPDATE的区别 博客分类: mysql基础应用 mysql insert时几个操作DE ...
- 【转】MySQL的Replace into 与Insert into on duplicate key update真正的不同之处
原文链接:http://www.jb51.net/article/47090.htm 今天听同事介绍oracle到mysql的数据migration,他用了Insert into ..... on ...
- 将表里的数据批量生成INSERT语句的存储过程 继续增强版
文章继续 桦仔兄的文章 将表里的数据批量生成INSERT语句的存储过程 增强版 继续增强... 本来打算将该内容回复于桦仔兄的文章的下面的,但是不知为何博客园就是不让提交!.... 所以在这里贴出来吧 ...
- mysql中 REPLACE INTO 和 INSERT INTO 的区别
mysql中 REPLACE INTO 和 INSERT INTO 的区别 REPLACE INTO 和 INSERT INTO 功能类似,都是像表中插入数据,不同点在于:REPLACE INTO 首 ...
- MySQL "replace into" 的坑以及insert相关操作
下面我们主要说一下在插入时候的几种情况: 1:insert ignore 2:replace into 3:ON DUPLICATE KEY UPDATE 关于insert ignore: 关于rep ...
随机推荐
- [SQL Server优化]善用系统监视器,确定系统瓶颈
原文:[SQL Server优化]善用系统监视器,确定系统瓶颈 来自: http://hi.baidu.com/solorez/blog/item/f82038fa0e71b78d9e51468c.h ...
- Maven聚合和继承的详细解释
说到聚合与继承我们都非常熟悉,maven相同也具备这种设计原则.以下我们来看一下Maven的pom怎样进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高. ...
- AndroidUI组件之TabHost
package com.gc.tabhost; /** * @author Android将军 * * * * 1.TabHost是一种非常有用的组件,TabHost能够非常方便地在窗体上放置 * 多 ...
- jsoup分解HTML DOM
采用jsoup 分解HTML .使用和JS操作DOM分类似. 示例代码: import java.io.IOException; import org.jsoup.Jsoup; import org. ...
- RS-232协议和RS-485协议
RS232 RS232是一种异步传输标准接口.通常 RS-232 接口以9个引脚 (DB-9) 或是25个引脚 (DB-25) 的型态出现 .RS232最经常使用的连接方式是三根线:一条发送线.一条接 ...
- 【iOS】多线程GCD
GCD(Grand Central Dispatch) : 牛逼的中枢调度器.苹果自带,纯C语言实现,提供了许多且强大的函数,它能够提高代码的运行效率与多核的利用率. 一.GCD的基本使用 1.GCD ...
- thinkphp学习笔记4—眼花缭乱的配置
原文:thinkphp学习笔记4-眼花缭乱的配置 1.配置类别 ThinkPHP提供了灵活的全局配置功能,ThinkPHP会依次加载管理配置>项目配置>调试配置>分组配置>扩展 ...
- Linux网络编程——连接和面向连接的协议之间没有区别
网络编程中最重要的概念就是连接取向(connection-oriented)和无连接(connectionless)协议.虽然本质.两者之间的区别是不难理解,编程的人来说,却是个非常easy混淆的问题 ...
- boost在自己主动确定数据类型(BOOST_TYPEOF和BOOST_AUTO)使用
#include<boost/typeof/typeof.hpp> #include<vector> #include<iostream> #include BOO ...
- Kinect SDK C++ - 2. Kinect Depth Data
Today we will learn how to get depth data from a kinect and what the format of the data is kinect co ...