Mysql replace与replace into都是经常会用到的功能;replace其实是做了一次update操作,而不是先delete再insert;而replace into其实与insert into很相像,但对于replace into,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。

replace是mysql 里面处理字符串比较常用的函数,可以替换字符串中的内容。类似的处理字符串的还有trim截取操作,这里就不在多说。

replace into 主要作用类似insert插入操作。主要的区别是replace会根据主键或者唯一索引检查数据是否存在,如果存在就先删除在更新。

例子:

#表结构:

CREATE TABLE `t_test` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`name` varchar(1) NOT NULL DEFAULT '',

PRIMARY KEY (`id`),

UNIQUE KEY `idx_name` (`name`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

插入第一条记录

INSERT INTO t_test (`name`)VALUES('a')

#或者

REPLACE INTO t_test (`name`)VALUES('a')

采用上面的方式插入二条记录,insert into 会提示错误:1062 - Duplicate entry ‘a' for key ‘idx_name', Time: 0.001000s。使用replace into则会正常执行,只是id自增长1。

ps:replace into 中into关键字可以省略的,看起来一样,使用有点区别

一、replace(object,search,replace)

把object中出现search的全部替换为replace

select replace('www.jb51.net','w','n') from ...    --->   nnn.jb51.net

例:把表table中的name字段中的detail替换为description

update table set name=replace(name,'detail','description')

二、replace into

相当于: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;

REPLACE的运行与INSERT很相像。如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。

注意,除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。

所有列的值均取自在REPLACE INTO语句中被指定的值。所有缺失的列被设置为各自的默认值,这和INSERT INTO一样。您不能从当前行中引用值,也不能在新行中使用值。如果您使用一个例如“SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。

使用REPLACE INTO,必须拥有表的INSERT和DELETE权限。

REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和。如果对于一个单行REPLACE该数为1,则一行被插入,同时没有行被删除。如果该数大于1,则在新行被插入前,有一个或多个旧行被删除。如果表包含多个唯一索引,并且新行复制了在不同的唯一索引中的不同旧行的值,则有可能是一个单一行替换了多个旧行。

受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或更大(替换)。

目前,您不能在一个子查询中,向一个表中更换,同时从同一个表中选择。

以下是所用算法的更详细的说明(该算法也用于LOAD DATA...REPLACE):

1. 尝试把新行插入到表中

2. 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时:

a. 从表中删除含有重复关键字值的冲突行

b. 再次尝试把新行插入到表中

三种形式:

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, ...

PS:

mysql中常用的三种插入数据的语句:

insert into表示插入数据,数据库会检查主键,如果出现重复会报错;

replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;

insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

本文标题: Mysql中replace与replace into的用法讲解

本文地址: http://www.cppcns.com/shujuku/mysql/254672.html

MySQL中replace主键_Mysql中replace与replace into的用法讲解相关推荐

  1. mysql创建临时表 主键_MySQL中临时表的基本创建与使用教程

    当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询. ...

  2. mysql 隐式主键_MySQL中复合主键性能的缺点

    我们有一个表,该表具有由三个字段组成的复合主键(在MySQL 5.1中是这样). 该表上每秒有近200个插入和200个选择,并且表的大小约为100万行,并且还在不断增加. 我的问题是:"复合 ...

  3. mysql 创建表主键_MySQL创建表和主键约束

    1.创建表 在操作数据表之前,应该使用"USE 数据库名"指定操作是在哪个数据库中进行 主键约束(唯一标识) ****非空*** ****唯一*** ****被引用****(学习外 ...

  4. mysql 什么是主键_mysql – 主键应该是什么?

    我遇到了一个我似乎无法解决的问题. 比如说我有一张即将发布的视频游戏发布的表格: GAME game_ID | title ----------------------------- 1 | Supe ...

  5. mysql增加修改主键_mysql怎么修改添加主键

    mysql修改添加主键的方法:执行[ALTER TABLE `test2` DROP PRIMARY KEY ,ADD PRIMARY KEY ( `id` );]语句即可修改主键. 添加表字段 (推 ...

  6. mysql 临时表 主键_MySQL中临时表的基本创建与使用教程(CREATETEMPORARY TABLE)

    当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询. ...

  7. java获取mysql表的主键_Spring中获取数据库表主键序列

    在程序开发中,我们经常有写数据库表的操作,数据表中经常带有主键自增序列,如何获取自增序列.spring中提供了相应的类 DataFieldMaxValueIncrementer. DataFieldM ...

  8. mysql 临时表增加主键_MySQL之重建表

    //MySQL之重建表// 在MySQL中,如果我们对大表频繁进行insert和delete操作,那么时间一长,这个表中会出现很多"空洞",也就是表碎片. 碎片产生的原因是inse ...

  9. mysql自增长主键_MySQL数据库8(九)列属性之主键、自增长

    主键 顾名思义,主要的键,primary key,在一张表中,有且只有一个字段,里面的值具有唯一性 创建主键 随表创建 系统提供了两种增加主键的方式: 1.直接在需要当做主键的字段之后,增加prima ...

最新文章

  1. 微信公众平台对所有公众号开放自定义菜单
  2. 仿赶集网二手物品页面左侧导航
  3. 给ztree节点赋值
  4. 管理处理器的亲和性(affinity)
  5. (蓝桥杯)2018JAVA B组 日志分析
  6. openwrt mt7620 内存大小检测
  7. mysql8.0 tar安装_CentOS7安装MySQL8.0 tar包
  8. 2.2线性表的顺序表
  9. TCP聊天工具的实现
  10. 解决Error: VM Exception while processing transaction: revert
  11. 微服务架构:统一身份认证和授权技术解决方案
  12. Matlab中的magic函数、vander函数、hilb函数、compan函数、pascal函数、zeros函数、ones函数、eye函数、rand函数、randn函数
  13. 2019裁员潮,测试被裁了能干什么?
  14. 工控变成用c语言还是plc,浅析工控机与PLC的区别
  15. MyEclipse 下载、安装教程
  16. 第22期《杂聊1:易破解密码列表》
  17. 仿班级聊天室(DOM原型法)并且用localStorage存储消息记录
  18. Redis数据库的部署及常用命令
  19. 转贴--爱的最高境界
  20. php中英文章,PHP 中英文混合排版中处理字符串常用的函数

热门文章

  1. apt编译java_自动生成代码工具--APT
  2. sprintf函数_C语言源代码展示:常用转换函数实现原理
  3. android tablet gps antenna,A Novel Tri-band GPS/WLAN Antenna for Tablet with Full Metal Housing
  4. python编译为机器码_通过 GraalVM 将 Java 程序编译成本地机器码!
  5. c语言求最后一个单词的长度,试题2:计算字符串最后一个单词的长度
  6. okhttp3图片压缩上传_支持 图片压缩、PDF压缩 合并 分割的网址、极力推荐、超奈斯...
  7. java 类型推导_Java10类型推导
  8. python反编译加密文件_python打包的二进制文件反编译
  9. Maven知识点记录 - profile
  10. androidStudio导入库文件