前言
1.replace into和insert into on duplicate key update,都需要原始数据表具有唯一性索引。
2.合并两张表,最简便还是使用如上语句(要有唯一性索引),如果不想创建唯一性索引,则可以通过存储过程实现。
环境
系统环境
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.4 LTS
Release:	18.04
Codename:	bionic
Linux version :       5.3.0-46-generic ( buildd@lcy01-amd64-013 ) 
Gcc version:         7.5.0  ( Ubuntu 7.5.0-3ubuntu1~18.04 )
软件信息
version : 	
     mysql  Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using  EditLine wrapper
正文
-- 创建测试表
-- 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
设计 merge_a_to_b 函数
CREATE DEFINER=`root`@`localhost` 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
验证
原始数据情况
mysql> SELECT * FROM test_b;
+------+------+---------------------+
| id   | name | Operatime           |
+------+------+---------------------+
| 1    | 1    | 2020-04-29 11:42:12 |
| 2    | 2    | 2020-04-29 11:42:12 |
+------+------+---------------------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM test_a;
+------+------+---------------------+
| id   | name | Operatime           |
+------+------+---------------------+
| 1    | 1    | 2020-04-29 11:42:12 |
| 3    | 3    | 2020-04-29 11:42:12 |
+------+------+---------------------+
2 rows in set (0.00 sec)
call merge_a_to_b 函数: 合并表a 和表b
mysql> call merge_a_to_b();
Query OK, 0 rows affected (0.02 sec)
mysql> SELECT * FROM test_b;
合并结果
+------+------+---------------------+
| id   | name | Operatime           |
+------+------+---------------------+
| 1    | 1    | 2020-04-29 13:39:59 |
| 2    | 2    | 2020-04-29 11:42:12 |
| 3    | 3    | 2020-04-29 13:39:59 |
+------+------+---------------------+
3 rows in set (0.00 sec)
后记
@TOC
