mysql replace, insert 高级用法
MYSQL 没有ORACLE MERGE INTO 语法。 但是有 REPLACE INTO ,和 INSERT INTO 。。 ON DUPLICATE KEY UPDATE 。。 可以供使用。
REPLACE 和INSERT 这两都共同之处:
1,都可以插入数据。
2,在目标表中已有重复KEY值记录时,可以更新目标表相应的记录字段值。
不同之处:
INSERT 。。。ON DUPLICATE KEY UPDATE : 只需更新 你需要更新的值 ,未指定的字段,保留原值。
REPLACE 。。就如其名字所蕴涵的意思一样, 如果你没有显式指定目标字段,那么目标字段将被置空/或更新为默认值。
—————测试样例:
(Production-ETL root@localhost) [test1]> show create table test2 \G
*************************** 1. row ***************************
Table: test2
Create Table: CREATE TABLE `test2` (
`id` int(11) NOT NULL,
`c1` char(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`c2` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT '^MYSQL^',
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
1 row in set (0.00 sec)
(Production-ETL root@localhost) [test1]> select * from test2 ;
+----+---------+------------+
| id | c1 | c2 |
+----+---------+------------+
| 1 | a++++ | aaaaa |
| 2 | b | CCCCCCCCCC |
| 3 | c++++++ | CC |
| 4 | === | NULL |
| 5 | how | CCCCCCCCCC |
| 6 | --f-- | EE |
| 7 | g++++++ | CC |
| 8 | --f-- | EE |
| 9 | --f-- | EE |
| 10 | --f-- | EE |
| 11 | a | DDDDDDDDDD |
| 12 | --++f | ^MYSQL^ |
| 13 | --++f | ^MYSQL^ |
| 14 | --++f | ^MYSQL^ |
| 15 | --++f | ^MYSQL^ |
+----+---------+------------+
15 rows in set (0.00 sec)
replace into test2 (id, c1,c2) select id , concat(c1,'++'), repeat(c2,5) from test2 where id=1 ;
replace into test2 (id, c1,c2) select id , concat(c1,'++'), substr(c2,1,2) from test2 where c1 in ('c', 'g') ;
replace into test2 (id, c1,c2) select id , reverse(concat(c1,'--')) m, substr(c2,1,2) n from test2 b where c1 in ('--f') ;
insert into test2 (id, c1,c2) select id, m, n from (select id , concat(c1,'++') m, substr(c2,1,2) n from test2 b where c1 in ('c++', 'g++'))v on duplicate key update c1= m, c2=n ;