脚本之家

电脑版
提示:原网页已由神马搜索转码, 内容由www.jb51.net提供.
您的位置:首页数据库Mysql→ MySQL实现merge into

MySQL实现merge into四种方法代码实例

  更新时间:2024年07月04日 10:18:37  作者:楠先生 
Merge into是一个数据库操作术语,通常用于将两个或多个表中的数据合并到一个表中,这篇文章主要给大家介绍了关于MySQL实现merge into四种方法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

Mysql 8.x 版本引入了 MERGE INTO 语法

Merge 语句的基本语法:
MERGE INTO target_table USING source_table ON condition
WHEN MATCHED THEN
UPDATE SET column1 = value1, column2 = value2, ...
WHEN NOT MATCHED THEN
INSERT (column1, column2, ...) VALUES (value1, value2, ...);
  • target_table: 要更新或插入数据的目标表。
  • source_table: 包含要合并数据的来源表。
  • condition: 指定用于匹配目标表和来源表数据的条件。
  • WHEN MATCHED: 当目标表和来源表数据匹配时,执行的更新操作。
  • WHEN NOT MATCHED: 当目标表和来源表数据不匹配时,执行的插入操作。

本文主要介绍将oracle中的merge into转换成MySQL的语法

在Oracle中,可以使用merge into,但是,MySQL中不支持,可以使用以下几种方法。

方法一:update + insert

merge其实就是不存在则insert,存在则update,所以可以把它拆分成:

update ... where exist(select 1 from ... where 条件)

insert .... where not exist(select 1 from ... where 条件)

先介绍where exists的用法

1.where exists

(1)介绍

exists和in都有过滤功能,他俩最大的差别就是in引导的子句只能对一个字段进行限制,比如

对id字段进行限定
select * from A where sid in (1,2,3)

但是如果我们想对多个字段进行限制,使用in就不合适了,例如

select * from A where (sid,tid) in (select sid,tid from B)
不过很可惜,上面的语句只能再DB2上执行,SQL Server不行

此时就可以使用exists 来对多个字段进行限制了

select * from A where exists (select 1 from B where A.sid=B.sid and A.tid=B.tid)

(2)原理

exists做为where条件时,是先对where 前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出。

查询时,一般情况下,子查询会分成两种情况:

1.子查询与外表的字段有关系时

select * from A where exists (select 1 from B where A.sid=B.sid and A.tid=B.tid)

它先执行A表的查询,再将查询结果一条一条放到B表的条件中去查询,如果存在,则显示此条

2.子查询与外表的字段没有任何关联

select * from A where exists (select * from B where B.id=‘条件‘)

在这种情况下,只要子查询的条件成立,就会查询出表1中的所有记录,反之,如果子查询中没有查询到记录,则表1不会查询出任何的记录。

以上两种方式本质上都是对A表查询进行过滤

2、update + insert

此种替代方式较为灵活,表可以无主键,自定义匹配规则。

注意:使用insert的时候需要加where not exists(select 1 from 表明 where 条件),防止重复插入

insert可以不加 where exists

方法二:replace into

 语法同insert into,使用简单,但有限制, replace into是根据主键去匹配,故replace into的表必须有主键,常用于单表更新新增。

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

所以还需要你有删除数据的权限。

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

需要注意的问题就是replace into的时候会删除老记录。如果表中有一个自增的主键,那么就要出问题了。

方法三:on duplicate key update

在MYSQL中有语句 insert into ... on duplicate key update...

INSERT INTO table (id, name, age) values (1, 'yourname', 18) 
ON DUPLICATE KEY UPDATE name='yourname', age=18;

id字段是主键或者UNIQUE索引。上述语句的作用是:

如果id = 1这条记录是不存在的,那么执行INSERT INTO语句。

如果id = 1在数据库中是存在的,那么执行UPDATE命令,此时这条语句相当于:

UPDATE table SET name='yourname', age=18 WHERE id=1; 

再如果 age 字段也是UNIQUE的,相当于

UPDATE table SET name='yourname' WHERE id=1 OR age=18 LIMIT 1; 

执行UPDATE语句的条件是INSERT语句的执行会造成唯一键的重复。

通常,应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。

还可以这样写:

INSERT INTO table 
(SELECT id, 'hisname' as name FROM table WHERE id >= 3)
ON DUPLICATE KEY UPDATE name=VALUES(name);

这种方法还可以用来批量执行UPDATE操作(因为单条UPDATE语句只能执行一种update操作)

方法四:创建存储过程

CREATE PROCEDURE name()

if exists(select 1 from 表 where ID = @ID)
begin
UPDATE 表 SET XX= XX WHERE ID = @ID
end
else
begin
INSERT 表 VALUES(XX...)
end

总结 

到此这篇关于MySQL实现merge into四种方法的文章就介绍到这了,更多相关MySQL实现merge into内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

    • 这篇文章主要介绍了Mysql 乘法除法精度不一致,除法后四位小数,本文通过问题分析实例代码讲解,给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
      2020-03-03
    • 所谓预编译语句就是将此类SQL语句中的值用占位符替代,可以视为将 SQL语句模板化或者说参数化,一般称这类语句叫Prepared Statements,下面这篇文章主要给大家介绍了关于MySQL SQL预处理(Prepared)的相关资料,需要的朋友可以参考下
      2022-01-01
    • 这篇文章主要介绍了MySQL全局共享内存介绍,全局共享内存则主要是 MySQL Instance(mysqld进程)以及底层存储引擎用来暂存各种全局运算及可共享的暂存信息,如存储查询缓存的 Query Cache,缓存连接线程的 Thread Cache等等,需要的朋友可以参考下
      2014-12-12
    • 按照discuz官方的建议,选的都是Non-Transactional Database Only 只支持MyISAM,其实默认都安装也挺好
      2016-04-04
    • 这篇文章主要介绍了mysql+mybatis+存储过程+事务 + 多并发流水号获取,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
      2021-12-12
    • 这篇文章主要给大家介绍了关于MySQL的时间进位问题的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
      2019-12-12
    • 这篇文章主要介绍了Mysql的Explain使用方式及索引总结,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
      2023-12-12
    • 这篇文章主要介绍了利用MySQL系统数据库做性能负载诊断的方法,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
      2019-09-09
    • 这篇文章主要介绍了windows下如何解决mysql secure_file_priv null问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
      2024-01-01
    • 这篇文章主要介绍了mysql实用技巧之比较两个表是否有不同数据的方法,结合实例形式分析了mysql数据表比较的相关操作技巧与注意事项,需要的朋友可以参考下
      2019-12-12

    最新评论