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
KEY
UNIQUE 索引。旧行插入新行之前删除。请參见 第13.2.5节,“INSERT语法”

REPLACE是一个MySQL扩展SQL标准。它要么插入或删除 和插入。还有一个MySQL扩展到标准的SQL。要么插入或 更新 -请參阅 第13.2.5.3,“INSERT
... ON DUPLICATE KEY UPDATE的SQL语法”

请注意。除非表有一个PRIMARY
KEY
或 UNIQUE索引。使用 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
):

  1. 尝试插入新行插入表

  2. 而插入失败。由于发生在主键或唯一索引的反复键错误:

    1. 从表中删除了反复的键值冲突的行

    2. 再次尝试插入新行插入表

可能的是在一个反复键错误的情况下,存储引擎能够运行REPLACE作为更新,而不是删除加插入,但语义是同样的。有没有比方何存储引擎添加一个可能的差异其它用户可见的效果 Handler_ XXX状态变量。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

MySQL replace into 说明(insert into 增强版)的更多相关文章

  1. MySQL replace into (insert into 的增强版)

    在使用SQL语句进行数据表插入insert操作时,如果表中定义了主键,插入具有相同主键的记录会报错:  Error Code: 1062. Duplicate entry 'XXXXX' for ke ...

  2. MySQL replace into 与insert into

    https://blog.csdn.net/helloxiaozhe/article/details/77427266 使用replace带来的问题 1.Replace into 操作在唯一键重复情况 ...

  3. MySQL replace into 用法(insert into 的增强版)

    转 http://blog.csdn.net/risingsun001/article/details/38977797 MySQL replace into 用法(insert into 的增强版) ...

  4. 将表里的数据批量生成INSERT语句的存储过程 增强版

    将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...

  5. mysql插入数据时 insert IGNORE、ON DUPLICATE KEY UPDATE、replace into

    转: mysql insert时几个操作DELAYED .IGNORE.ON DUPLICATE KEY UPDATE的区别 博客分类: mysql基础应用   mysql insert时几个操作DE ...

  6. 【转】MySQL的Replace into 与Insert into on duplicate key update真正的不同之处

    原文链接:http://www.jb51.net/article/47090.htm   今天听同事介绍oracle到mysql的数据migration,他用了Insert into ..... on ...

  7. 将表里的数据批量生成INSERT语句的存储过程 继续增强版

    文章继续 桦仔兄的文章 将表里的数据批量生成INSERT语句的存储过程 增强版 继续增强... 本来打算将该内容回复于桦仔兄的文章的下面的,但是不知为何博客园就是不让提交!.... 所以在这里贴出来吧 ...

  8. mysql中 REPLACE INTO 和 INSERT INTO 的区别

    mysql中 REPLACE INTO 和 INSERT INTO 的区别 REPLACE INTO 和 INSERT INTO 功能类似,都是像表中插入数据,不同点在于:REPLACE INTO 首 ...

  9. MySQL "replace into" 的坑以及insert相关操作

    下面我们主要说一下在插入时候的几种情况: 1:insert ignore 2:replace into 3:ON DUPLICATE KEY UPDATE 关于insert ignore: 关于rep ...

随机推荐

  1. SQL Server 2008性能故障排查(三)——I/O

    原文:SQL Server 2008性能故障排查(三)--I/O 接着上一章:CPU瓶颈 I/O瓶颈(I/O Bottlenecks): SQLServer的性能严重依赖I/O子系统.除非你的数据库完 ...

  2. 搞个这样的APP要多久? (转)

    这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座.开始了…… 我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要 ...

  3. Mina框架与Spring整合配置文件

    Mina框架与Spring的整合事实上非常easy,主要是要弄清楚要注入的属性的名称,进而选择合适的注入方法. 关于Spring的四种注入方法请还有一篇文章:spring依赖注入的四种方式 <? ...

  4. Android系统关机或几种方式重启

    ---------------------------------------------------------------------------------------------------- ...

  5. Android-往来:添加到联系人

    //添加到联系人.使用事务 public void testAddContact() { String name[]={"周杰伦","谢霆锋","言承 ...

  6. NSIS:在线下载并安装程序

    原文 NSIS:在线下载并安装程序 看到有同学留言说需要这方面的代码,所以贴出以下代码供参考(非完整脚本).需要用NSISdl插件. Section -.NET Framework    NSISdl ...

  7. NSIS:卸载时选择组件

    原文 NSIS:卸载时选择组件 有时候,我们想要在卸载时也可以选择组件,进行定制性的卸载,那么,以下文字将简略讨论这个问题: 题外:我们想要卸载时选择组件,当然是在安装时要有组件选择页面的前提下,也就 ...

  8. C#中假设正确使用线程Task类和Thread类

    C#中使用线程Task类和Thread类小结 刚接触C#3个月左右.原先一直使用C++开发.由于公司的须要,所地採用C#开发.主要是控制设备的实时性操作,此为背景. 对于C#中的Task和Thread ...

  9. a^b%c 的三种形式

    求a^b%c,(1  <= a,b <= 2^62, 1 <= c <= 10^9) 最主要的高速幂 _LL mod_exp(_LL a, _LL b, int c) { _L ...

  10. ABP领域层——工作单元(Unit Of work)

    ABP领域层——工作单元(Unit Of work) 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12.ABP领域层——工作单元(Unit Of work) ...