使用CONCAT语句批量执行MySQL插入操作

背景

批量插入是在MySQL操作中经常需要使用到的。使用CONCAT和GROUP_CONCAT语句将能够很大程度上提升工作效率,减少了对使用脚本完成任务的需求。通常情况下,直接使用SQL语句能够比使用脚本运行效率高上许多。

今天在工作过程中遇到了如下的一个实际问题:有两个表,数据量较大,分别为表X和表Y,结构如下:

# X表

Key1    Key2    Key3    ...    KeyN
1       Val 1  ...
2       Val 2
3       Val 3
4       Val 4
...     ...
N       Val N
# Y表

KeyA    KeyB    KeyC
2       Val A   0
1       Val B   1
3       Val C   1
2       Val D   0
...     ...     ...
N       Val E   0

需要进行的操作是,找出X表中Key2值中以“ZH_”开头的项目,提取出对应的Key1的值,将Key1的值对应插入Y表的KeyB。插入时,对应的KeyA置为3,KeyC置为0。

例如,在X表中有如下一个条目

Key1    Key2    Key3    ...    KeyN
28      ZH_123  ...

这个条目满足要求,插入表Y

KeyA    KeyB    KeyC
3       28      0

解决

考虑使用如下命令执行批量操作

INSERT INTO table_name (key1, key2, key3 ...) VALUES (val1a, val2a, val3a...), (val1b, val2b, val3b...)...;

要使用如下命令,关键难度在于得到VALUE部分,所以这里使用CONCAT和GROUP_CONCAT组合命令来完成。

首先,使用以下命令,得到组合好格式的VALUES

SELECT GROUP_CONCAT(CONCAT( "(3,",Key1 ,",0)") SEPARATOR ',') FROM Table_X WHERE Key2 LIKE "ZH_%";

#使用上条命令后将得到如下查询结果:
(3,28,0), (3,30,0), (3,41,0), (3,52,0), (3,78,0)...

将结果组合到INSERT INTO语句中,便得到了我们需要的语句:

INSERT INTO Table_Y (keyA, KeyB, KeyC) VALUES (3,28,0), (3,30,0), (3,41,0), (3,52,0), (3,78,0)...;

顺便提一句,使用以下命令是无法完成的:

INSERT INTO Table_Y (keyA, KeyB, KeyC) VALUES (SELECT GROUP_CONCAT(CONCAT( "(3,",Key1 ,",0)") SEPARATOR ',') FROM Table_X WHERE Key2 LIKE "ZH_%");

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注