MySQL:能否循环执行SELECT处理文件Realm值或单查询批量获取?
解决方法
一、循环执行查询并导出结果
由于MySQL服务器启用了--read-only,无法在服务器端创建循环逻辑,只能在客户端通过脚本实现循环处理:
- 用Shell、Python等脚本语言读取文本文件的每一行Realm值,逐个执行查询语句
- 将每次查询的结果追加到目标文本文件中
示例Shell脚本如下:
#!/bin/bash # 输入文件:realm_list.txt(每行一个Realm值) # 输出文件:result.txt > result.txt # 清空结果文件 while read -r realm; do # 注意:若Realm含单引号等特殊字符,需先做转义处理 mysql -u 你的用户名 -p'你的密码' 你的数据库名 -e "SELECT PartnerPk FROM CUSTOMER WHERE Realm='$realm';" >> result.txt done < realm_list.txt
二、单查询一次扫描获取所有结果(推荐)
这种方法仅扫描一次CUSTOMER表,能大幅节省耗时,有两种实现方式:
方式1:拼接IN子句
把文本文件中的所有Realm值转换成IN条件的字符串列表,执行一次查询:
- 将文本文件的每行内容转换为带单引号的格式,再用逗号拼接成列表
- 执行如下查询并导出结果:
SELECT PartnerPk FROM CUSTOMER WHERE Realm IN ('aaa.bbb.ccc.ddd', 'xxx.yyy.zzz', ...);
可通过Shell命令自动生成IN子句:
# 把realm_list.txt转换成IN子句格式 realm_in=$(sed "s/^/'/; s/$/',/" realm_list.txt | tr -d '\n' | sed 's/,$//') # 执行查询并导出结果到文件 mysql -u 你的用户名 -p'你的密码' 你的数据库名 --batch --silent -e "SELECT PartnerPk FROM CUSTOMER WHERE Realm IN ($realm_in);" > result.txt
方式2:加载文件到临时表关联查询(需开启LOAD DATA LOCAL)
若MySQL客户端和服务器允许LOAD DATA LOCAL INFILE,可将文本文件加载到会话级临时表,再关联CUSTOMER表查询:
-- 创建会话级临时表(read-only不影响,会话结束自动销毁) CREATE TEMPORARY TABLE temp_realms (realm VARCHAR(255) NOT NULL); -- 加载本地文件到临时表 LOAD DATA LOCAL INFILE '/你的文件路径/realm_list.txt' INTO TABLE temp_realms; -- 关联查询,仅扫描一次CUSTOMER表 SELECT c.PartnerPk FROM CUSTOMER c JOIN temp_realms t ON c.Realm = t.realm;
执行后将查询结果导出到文件即可,注意需确保客户端启用--local-infile=1参数、服务器配置local_infile=ON。
内容的提问来源于stack exchange,提问作者boardrider
相关产品推荐
相关产品推荐

