You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将CSV多列数据导入MySQL单个字段,无法用LOAD DATA有替代方案吗

实现CSV三列手机号合并导入MySQL单字段的方案

方法一:使用LOAD DATA LOCAL INFILE实现

前置检查

执行以下命令开启当前会话的本地文件导入权限(避免全局修改需要高权限):

SET SESSION local_infile = 'ON';

导入逻辑

因为需要把单行三列数据拆为三行存入目标表,推荐用临时表中转的方式,一次导入即可完成:

  1. 先创建临时中转表存储CSV三列数据:
CREATE TEMPORARY TABLE temp_phone (
    col1 VARCHAR(20),
    col2 VARCHAR(20),
    col3 VARCHAR(20)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  1. 把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; -- 跳过第一行表头
  1. 把临时表三列数据合并插入目标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文件挂载为表,再执行合并插入:

  1. 创建CSV引擎的中转表:
CREATE TABLE csv_phone (
    col1 VARCHAR(20),
    col2 VARCHAR(20),
    col3 VARCHAR(20)
) ENGINE=CSV DEFAULT CHARSET=utf8mb4;
  1. 找到MySQL数据目录下对应库的csv_phone.CSV文件,用你的CSV文件替换它(注意先删除CSV的表头行),执行FLUSH TABLE csv_phone;刷新表数据。
  2. 执行和方法一相同的UNION ALL语句把数据插入目标表即可。

内容的提问来源于stack exchange,提问作者ccs_2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 20:15:02