mysql实现merge into问题

 更新时间:2024年12月19日 11:58:24   作者:Mars'Ares  
文章介绍了在数据库操作中,如何使用`REPLACE INTO`和`INSERT INTO ON DUPLICATE KEY UPDATE`语句进行数据更新和插入操作,如果不想创建唯一性索引,可以通过存储过程实现,文章通过实验和验证,展示了这两种方法的实际效果

一 前言

1.查了很多资料,replace into也好 insert into on duplicate key update 也好,都需要原始数据表具有唯一性索引。

2.网上方法很多,最简便还是使用如上语句,如果不想创建唯一性索引,则可以通过存储过程实现。不解释连招如下。

二 实验

-- 创建测试表
-- drop table test_a;
create  table test_a(
id VARCHAR (16),
name VARCHAR (16),
Operatime datetime
)
-- drop table test_b;
create table test_b(
id VARCHAR (16),
name VARCHAR (16),
Operatime datetime
)

-- 插入模拟数据
INSERT into test_b values(1,"1",now()),(2,"2",now());
INSERT into test_a values(1,"1",now()),(3,"3",now());

-- 查询数据
SELECT * FROM test_b;
SELECT * FROM test_a;
 
delimiter $
CREATE PROCEDURE merge_a_to_b () BEGIN
-- 定义需要插入从a表插入b表的过程变量
DECLARE _ID VARCHAR (16);
DECLARE _NAME VARCHAR (16);
-- 游标遍历数据结束标志 
DECLARE done INT DEFAULT FALSE;
-- 游标指向a表结果集第一条-1位置
DECLARE cur_account CURSOR FOR SELECT ID, NAME FROM test_a;
-- 游标指向a表结果集最后一条加1位置 设置结束标志
DECLARE CONTINUE HANDLER FOR NOT FOUND  SET done = TRUE;
-- 打开游标
OPEN cur_account;
-- 遍历游标
read_loop :
LOOP
--  取值a表当前位置数据到临时变量
	FETCH NEXT FROM cur_account INTO _ID,_NAME;

-- 如果取值结束 跳出循环
IF done THEN LEAVE read_loop; 
END IF;

-- 当前数据做 对比 如果b表存在则更新时间 不存在则插入
IF NOT EXISTS ( SELECT 1 FROM TEST_B WHERE ID = _ID AND NAME=_NAME ) 
	THEN
		INSERT INTO TEST_B (ID, NAME,operatime) VALUES (_ID,_NAME,now());
	ELSE 
	UPDATE TEST_B  set operatime = now() WHERE ID = _ID AND NAME=_NAME;
END IF;

END LOOP;
CLOSE cur_account;

END $

三 验证

-- 验证语句
SELECT * FROM test_b;
SELECT * FROM test_a;
call merge_a_to_b();
SELECT * FROM test_b;
SELECT * FROM test_a;
  • 操作前

  • 操作后

数据1更新 数据3插入 ok

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MYSQL查看时区并设置时区的实现示例

    MYSQL查看时区并设置时区的实现示例

    本文主要介绍了MYSQL查看时区并设置时区的实现示例,包括查看全局和会话时区设置,设置全局和会话时区为东八区,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • MySQL中limit语法及用法小结

    MySQL中limit语法及用法小结

    LIMIT 是 MySQL 中的一个特殊关键字,用于指定查询结果从哪条记录开始显示,一共显示多少条记录,本文重点介绍MySQL中limit语法及用法小结,感兴趣的朋友一起看看吧
    2023-10-10
  • MySQL8新特性之全局参数持久化详解

    MySQL8新特性之全局参数持久化详解

    从8.0开始,可通过SET PERSIST命令将全局变量的修改持久化到配置文件中,下面这篇文章主要给大家介绍了关于MySQL8新特性之全局参数持久化的相关资料,需要的朋友可以参考下
    2021-10-10
  • MySQL触发器概念、原理与用法详解

    MySQL触发器概念、原理与用法详解

    这篇文章主要介绍了MySQL触发器概念、原理与用法,结合实例形势详细分析了mysql触发器相关概念、原理、创建、用法及操作注意事项,需要的朋友可以参考下
    2019-07-07
  • centos7.3 安装mysql5.7.18的详细教程

    centos7.3 安装mysql5.7.18的详细教程

    这篇文章主要介绍了centos7.3 安装mysql5.7.18的详细教程,需要的朋友可以参考下
    2017-06-06
  • MySQL字符集和排序规则详解(推荐)

    MySQL字符集和排序规则详解(推荐)

    MySQL中,字符集和排序规则在处理文本数据时起着至关重要的作用,本文将详细介绍 MySQL中的字符集和排序规则,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • MySQL DDL 引发的同步延迟该如何解决

    MySQL DDL 引发的同步延迟该如何解决

    这篇文章主要介绍了MySQL DDL 引发的同步延迟该如何解决,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下
    2021-05-05
  • Mysql数据库表中为什么有索引却没有提高查询速度

    Mysql数据库表中为什么有索引却没有提高查询速度

    你有没有想起过为什么明明再数据库中有索引,但是查询速度却并没有希望的那样快?本篇文章将带给你答案,跟小编一起看看吧
    2022-02-02
  • mysql的MVCC多版本并发控制的实现

    mysql的MVCC多版本并发控制的实现

    这篇文章主要介绍了mysql的MVCC多版本并发控制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 你可能有所不知的MySQL正则表达式总结

    你可能有所不知的MySQL正则表达式总结

    使用正则表达式可以检索或替换符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串,下面这篇文章主要给大家介绍了关于MySQL正则表达式的相关资料,需要的朋友可以参考下
    2023-05-05

最新评论