会碰到下列场景:当记录,在目标表中存在就更新值,若不存在就插入记录。
一、示例数据
-- test_source 数据源表 CREATE TABLE `test_source` ( `id` int(11) NOT NULL AUTO_INCREMENT, `BWKEY` varchar(255) DEFAULT NULL, `MATNR` varchar(255) DEFAULT NULL, `VERPR` double(255,0) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `sBWKEY` (`BWKEY`,`MATNR`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 INSERT INTO `zjkywms`.`test_source`(`id`, `BWKEY`, `MATNR`, `VERPR`) VALUES (1, '2105', 'A', 1); INSERT INTO `zjkywms`.`test_source`(`id`, `BWKEY`, `MATNR`, `VERPR`) VALUES (2, '2105', 'B', 2); INSERT INTO `zjkywms`.`test_source`(`id`, `BWKEY`, `MATNR`, `VERPR`) VALUES (3, '2105', 'C', 3); INSERT INTO `zjkywms`.`test_source`(`id`, `BWKEY`, `MATNR`, `VERPR`) VALUES (4, '2106', 'A', 4); INSERT INTO `zjkywms`.`test_source`(`id`, `BWKEY`, `MATNR`, `VERPR`) VALUES (5, '2106', 'B', 5); INSERT INTO `zjkywms`.`test_source`(`id`, `BWKEY`, `MATNR`, `VERPR`) VALUES (6, '2106', 'C', 6); -- test_target 目标表/待更新或插入 CREATE TABLE `test_target` ( `id` int(11) NOT NULL AUTO_INCREMENT, `BWKEY` varchar(255) DEFAULT NULL, `MATNR` varchar(255) DEFAULT NULL, `VERPR` double(255,0) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `tBWKEY` (`BWKEY`,`MATNR`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 INSERT INTO `zjkywms`.`test_target`(`id`, `BWKEY`, `MATNR`, `VERPR`) VALUES (1, '2105', 'A', 7); INSERT INTO `zjkywms`.`test_target`(`id`, `BWKEY`, `MATNR`, `VERPR`) VALUES (2, '2106', 'C', 6); INSERT INTO `zjkywms`.`test_target`(`id`, `BWKEY`, `MATNR`, `VERPR`) VALUES (3, '2107', 'Z', 9);
二、update + insert 二步操作
-- 待更新的记录 SELECT * from test_target t inner JOIN test_source s on s.BWKEY=t.BWKEY and s.MATNR=t.MATNR; -- update test_target t inner JOIN test_source s on s.BWKEY=t.BWKEY and s.MATNR=t.MATNR set t.VERPR=s.VERPR -- 待插入的记录 -- insert into test_target (BWKEY,MATNR,VERPR) SELECT s.BWKEY,s.MATNR,s.VERPR from test_source s where not exists (select 1 from test_target t where s.BWKEY=t.BWKEY and s.MATNR=t.MATNR);
效果
mysql> select * from test_target; +----+-------+-------+-------+ | id | BWKEY | MATNR | VERPR | +----+-------+-------+-------+ | 1 | 2105 | A | 1 | | 2 | 2106 | C | 6 | | 5 | 2107 | Z | 9 | | 6 | 2105 | B | 2 | | 7 | 2105 | C | 3 | | 8 | 2106 | A | 4 | | 9 | 2106 | B | 5 | +----+-------+-------+-------+ 7 rows in set (0.03 sec)
记录ID:1是更新记录,原值是7;6~9是插入记录。
三、Oracle一步操作
<待完成>
四、MySQL一步操作
<待完成>