Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql实现merge into

mysql实现merge into问题

作者: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

总结

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

您可能感兴趣的文章:
阅读全文