mysql实现merge into_mysql 实现merge into-Go语言中文社区

一 前言

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;

操作前

b5880ffb8c8bdae3f628d823fe8a44f6.png

ef59467a43db47db1c1938ee2ca63b3b.png

操作后   数据1更新  数据3插入 ok

05375a3fc247fba06d1bc42bf9f2850c.png

2d97fed920e17fd03a5b1fc9e68d3185.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值