如何将CSV多列数据导入MySQL单个字段,无法用LOAD DATA有替代方案吗
实现CSV三列手机号合并导入MySQL单字段的方案
方法一:使用LOAD DATA LOCAL INFILE实现
前置检查
执行以下命令开启当前会话的本地文件导入权限(避免全局修改需要高权限):
SET SESSION local_infile = 'ON';
导入逻辑
因为需要把单行三列数据拆为三行存入目标表,推荐用临时表中转的方式,一次导入即可完成:
- 先创建临时中转表存储CSV三列数据:
CREATE TEMPORARY TABLE temp_phone ( col1 VARCHAR(20), col2 VARCHAR(20), col3 VARCHAR(20) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 把CSV全量导入临时表:
LOAD DATA LOCAL INFILE '/你的/csv/文件/绝对路径/phone.csv' INTO TABLE temp_phone FIELDS TERMINATED BY ',' -- 可选:如果CSV字段有双引号包裹就加下面这句 -- ENCLOSED BY '"' -- Windows下生成的CSV换行是\r\n,改成LINES TERMINATED BY '\r\n' LINES TERMINATED BY '\n' IGNORE 1 ROWS; -- 跳过第一行表头
- 把临时表三列数据合并插入目标
phone表:
INSERT INTO phone (phone) SELECT col1 FROM temp_phone WHERE col1 IS NOT NULL AND col1 != '' UNION ALL SELECT col2 FROM temp_phone WHERE col2 IS NOT NULL AND col2 != '' UNION ALL SELECT col3 FROM temp_phone WHERE col3 IS NOT NULL AND col3 != '';
如果CSV行数很少不想建临时表,也可以直接执行三次LOAD DATA语句,每次修改SET后的赋值字段即可:
-- 第一次导入第一列 LOAD DATA LOCAL INFILE '/path/phone.csv' INTO TABLE phone FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS (@c1,@c2,@c3) SET phone = @c1; -- 第二次导入第二列 LOAD DATA LOCAL INFILE '/path/phone.csv' INTO TABLE phone FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS (@c1,@c2,@c3) SET phone = @c2; -- 第三次导入第三列 LOAD DATA LOCAL INFILE '/path/phone.csv' INTO TABLE phone FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS (@c1,@c2,@c3) SET phone = @c3;
方法二:无法使用LOAD DATA LOCAL INFILE的替代方案
方案1:直接生成SQL插入语句
如果CSV数据量很小,可以直接把内容转为INSERT语句执行:
INSERT INTO phone(phone) VALUES ('11111111'),('22222222'),('33333333');
如果数据量大,可以用Excel公式、shell脚本快速批量生成SQL,再复制到MySQL客户端执行。
方案2:用外部脚本处理后批量插入
以Python为例,读取CSV展平三列后批量插入:
import csv import pymysql # 替换为自己的数据库连接信息 db = pymysql.connect(host="127.0.0.1", user="root", password="你的密码", database="你的库名", charset="utf8mb4") cursor = db.cursor() phone_list = [] with open("phone.csv", mode="r", encoding="utf-8") as f: reader = csv.reader(f) next(reader) # 跳过表头 for row in reader: # 把每行的三个手机号加入待插入列表,自动过滤空值 phone_list.extend([(p.strip(),) for p in row if p.strip()]) # 批量插入 cursor.executemany("INSERT INTO phone(phone) VALUES (%s)", phone_list) db.commit() cursor.close() db.close()
方案3:使用CSV存储引擎挂载
如果你的MySQL支持CSV存储引擎,可以直接把CSV文件挂载为表,再执行合并插入:
- 创建CSV引擎的中转表:
CREATE TABLE csv_phone ( col1 VARCHAR(20), col2 VARCHAR(20), col3 VARCHAR(20) ) ENGINE=CSV DEFAULT CHARSET=utf8mb4;
- 找到MySQL数据目录下对应库的
csv_phone.CSV文件,用你的CSV文件替换它(注意先删除CSV的表头行),执行FLUSH TABLE csv_phone;刷新表数据。 - 执行和方法一相同的UNION ALL语句把数据插入目标表即可。
内容的提问来源于stack exchange,提问作者ccs_2000
相关产品推荐
相关产品推荐

