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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。