≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
位置:首页 > 数据库 > MySQL

MySQL的REPLACE和ON DUPLICATE KEY UPDATE语句介绍解决问题实例

人气:284 时间:2020-07-09

这篇文章主要为大家详细介绍了MySQL的REPLACE和ON DUPLICATE KEY UPDATE语句介绍解决问题实例,具有一定的参考价值,可以用来参考一下。

感兴趣的小伙伴,下面一起跟随四海网的小编小韵来看看吧!


在对看看的后台进行排序的时候,遇到了一个像这样的需求,在电影表中有ID(主键自增)和orderby(排序字段) ,假设有十条数据id分别从1-10之间,对应的orderby也是从1-10之间,我现在想把id=9的数据移动到第三的位置(id=3)的这个位置,并且保证之前的数据排列顺序(即id=3的orderby=4,id=4的orderby=5…id=8的orderby=9),这样如果用循环的形式是可以解决数据的问题,但是这样操作数据库过程太多,现在就想用一条sql语句来解决这个问题.

下面来看看Mysql的REPLACE和INSERT ... ON DUPLICATE KEY UPDATE

REPLACE

我们在使用数据库时可能会经常遇到这种情况。如果一个表在一个字段上建立了唯一索引,当我们再向这个表中使用已经存在的键值插入一条记录,那将会抛出一个主键冲突的错误。当然,我们可能想用新记录的值来覆盖原来的记录值。如果使用传统的做法,必须先使用DELETE语句删除原先的记录,然后再使用INSERT插入新的记录。而在MySQL中为我们提供了一种新的解决方案,这就是REPLACE语句。使用REPLACE插入一条记录时,如果不重复,REPLACE就和INSERT的功能一样,如果有重复记录,REPLACE就使用新记录的值来替换原来的记录值。

使用REPLACE的最大好处就是可以将DELETE和INSERT合二为一,形成一个原子操作。这样就可以不必考虑在同时使用DELETE和INSERT时添加事务等复杂操作了。

在使用REPLACE时,表中必须有唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE就和INSERT完全一样的。

在执行REPLACE后,系统返回了所影响的行数,如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了DELETE删除这条记录,然后再记录用INSERT来插入这条记录。如果返回的值大于2,那说明有多个唯一索引,有多条记录被删除和插入。

INSERT ... ON DUPLICATE KEY UPDATE

INSERT ... ON DUPLICATE KEY UPDATE的作用:插入数据时,如果插入的数据中对应的主键或唯一索引的值在表中已存在,则将此条数据对应的字段值修改。如果不存在则直接插入。

如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:

代码如下:


mysql>INSERT INTO table (a,b,c) VALUES (1,2,3)  

 

          ->ON DUPLICATE KEY UPDATE c=c+1; 

mysql>UPDATE table SET c=c+1 WHERE a=1; 


如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。
注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当

代码如下:


mysql>UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;  

如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,你应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。
你可以在UPDATE子句中使用VALUES(col_name)函数从INSERT...UPDATE语句的INSERT部分引用列值。换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT...UPDATE语句中有意义,其它时候会返回NULL。
当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。

 

上面的那个问题的sql语句为:

代码如下:


insert into st_movie(id,orderby) values(9,3),(3,4),(4,5),(5,6),(6,7),(7,8),(8,9)  ON DUPLICATE KEY UPDATE `orderby`= values(`orderby`);

 

本文来自:http://www.q1010.com/177/9493-0.html

注:关于MySQL的REPLACE和ON DUPLICATE KEY UPDATE语句介绍解决问题实例的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。

关键词:MYSQL

您可能感兴趣的文章

  • MySQL双向加密解密方式用法分析
  • MySQL把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法
  • MySQL5.5与mysq 5.6中禁用innodb引擎的方法
  • MySQL的group_concat函数使用示例
  • MySQL导入sql文件命令和MySQL远程登陆使用分析
  • MySQL子查询的几种常见形式介绍
  • MySQL存储过程实例
  • MySQL DBA教程:MySQL性能优化之缓存参数优化
  • MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)
  • MySQL联合查询UNION和Order by同时使用报错问题的解决办法
上一篇:MySQL表名不区分大小写的设置方法
下一篇:MySQL DBA教程:MySQL性能优化之缓存参数优化
热门文章
  • mysql 修改character_set_server为utf-8的简单示例
  • 解决MySQL丢失文件localhost.localdomain.pid、mysql.sock的示例
  • MySQL 数据类型binary和varbinary的简单示例
  • MySQL:reading initial communication packet问题解决方法
  • MySql 表类型MYISAM、InnoDB区别
  • bash: mysql: command not found 的解决方法
  • MYSQL默认用户名ROOT修改方法
  • MySQL 常用命令菜鸟教程
  • MySQL 使用命令行新建用户并授予权限
  • MySql 数据库物理文件存放位置查看示例
  • 最新文章
    • MySQL查看死锁与解除死锁的简单示例
    • MySQL 慢查询的功能实例
    • MySQL查看死锁与去除死锁的简单示例
    • MySQL找出未提交事务的SQL的简单示例
    • MySQL锁阻塞的的简单示例
    • MySQL中的binary类型使用操作的示例
    • SQL优化教程之in与range查询的简单示例
    • MySQL 的 21 个规范、优化最佳实践!
    • MySQL 字符类型大小写敏感的简单示例
    • 解决mybatis-plus分页传入参数后sql where条件没有limit分页信息的问题

四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。