MySQL实现Oracle merge into函数

MySQL实现Oracle merge into函数

之前有撰文 Oracle、MySQL兼容 – merge into,其中介绍了MySQL用INSERT … ON DUPLICATE KEY UPDATE和存储过程实现merge into,本文介绍其它的两种方法实现merge into。

1、replace into

​ 语法同insert into,使用简单,但有限制, replace into是根据主键去匹配,故replace into的表必须有主键,常用于单表更新新增。

2、update + insert

​ 此种替代方式较为灵活,表可以无主键,自定义匹配规则。

-- 数据
create table test_info(
	id int,
	data1 varchar(200),
	deleted int,
	userid int
);
INSERT INTO test_info(id, data1, deleted, userid) VALUES(1, '111', 0, 1);
INSERT INTO test_info(id, data1, deleted, userid) VALUES(2, '222', 0, 2);
INSERT INTO test_info(id, data1, deleted, userid) VALUES(3, '333', 0, 3);
INSERT INTO test_info(id, data1, deleted, userid) VALUES(4, '444', 0, 4);

create table test_user(
	id int,
	name varchar(30),
	age int,
	address varchar(100)
);
INSERT INTO test_user(id, name, age, address) VALUES(1, 'TOM', 10, 'TTT');
INSERT INTO test_user(id, name, age, address) VALUES(2, 'JIM', 10, 'JJJ');
INSERT INTO test_user(id, name, age, address) VALUES(3, 'MARY', 10, 'MMM');
INSERT INTO test_user(id, name, age, address) VALUES(4, 'HILY', 10, 'HHH');

create table test_info_user(
	name varchar(30),
	age int,
	data1 varchar(200)
);

INSERT INTO test_info_user(name, age, data1) VALUES('JIM', 0, 'AAA');
INSERT INTO test_info_user(name, age, data1) VALUES('TOM', 0, 'AA');
INSERT INTO test_info_user(name, age, data1) VALUES('BILY', 0, 'BBB');

-- Oracle
MERGE INTO TEST_INFO_USER T1 USING (SELECT B.NAME, B.AGE, A.DATA1 FROM TEST_INFO A, TEST_USER B WHERE A.USERID = B.ID) T2
ON (T1.NAME = T2.NAME)
WHEN MATCHED THEN UPDATE SET T1.AGE = T2.AGE, T1.DATA1 = T2.DATA1
WHEN NOT MATCHED THEN INSERT (NAME, AGE, DATA1) VALUES(T2.NAME,T2.AGE,T2.DATA1);

-- MySQL
update test_info_user t1, (select b.name, b.age, a.data1 from test_info a, test_user b where a.userid = b.id) t2
set t1.age = t2.age, t1.data1 = t2.data1
where t1.name = t2.name and t1.name is not null;

insert into test_info_user(name, age, data1) 
select t2.name, t2.age, t2.data1 from test_info_user t1
right join (select b.name, b.age, a.data1 from test_info a, test_user b where a.userid = b.id) t2
on t1.name = t2.name
where t1.name is null;

你可能感兴趣的:(MySQL,mysql,oracle,数据库)