mysql 实现merge into

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

一 前言

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

点这里可以跳转到人工智能网站