如何将excel导入表中,解决 MySQL 中 LOAD DATA INFILE 导入及表结构修改的系列问题

先说总结吧,还是Navicat图形化工具好用,对于导入数据来说

  1. 我是先将excel转化成.csv文件格式
  2. 然后通过Navicat找到表,右键 →「导入向导」
  3. 选择文件:
  4. 选择对应字段名:
  5. 如果上边字段名显示的是乱码,那就去看看你的csv文件是不是utf-8编码,如果不是修改过来就可以
  6. 选择导入的模式:
  7. 然后点击开始就行了

只想看如何导入的可以不用往下看

下边就是我刚开始试图采用的sql语句导入方式

一、问题场景与初始报错

(一)需求背景

想要通过 LOAD DATA INFILE 语句将存储快递公司信息的 CSV 文件导入到 logistics_company 表中,同时对表结构进行调整,让 id 字段能自动生成 UUID 作为默认值,过程中遇到了一系列报错,需要逐步解决。

(二)初始操作与报错

  1. 执行 LOAD DATA INFILE 导入
    执行如下 SQL 语句尝试导入数据:
LOAD DATA INFILE 'D:/副本快递100快递公司标准编码-20250805112038.csv'
INTO TABLE logistics_company
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS 
(company_name, company_no, company_type, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy)
SET id = UUID(), 
    delete_flag = 'normal', 
    create_by = 'admin',
    create_date= CURRENT_TIMESTAMP,
    update_date= CURRENT_TIMESTAMP,
    update_by = 'admin', 
    versions = 1; 

报错:1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement ,原因是 MySQL 的 secure-file-priv 配置限制了文件导入路径 。

这个时候我修改了secure-file-priv 配置,但是还是不行

然后我就开始尝试图形化工具navicat,但是我的主键id没有设置默认值,所以导入数据报错了,所以我修改表结构

  1. 尝试修改表结构设置 id 默认值
    执行语句想让 id 字段默认用 UUID() 生成并作为主键:
ALTER TABLE logistics_company 
MODIFY COLUMN id VARCHAR(36) NOT NULL COMMENT '主键' 
DEFAULT (UUID()) PRIMARY KEY;

报错:1068 - Multiple primary key defined ,因为原表中 id 已经是主键,此语句重复定义主键导致错误 。


二、问题分析与解决思路

(一)secure-file-priv 限制问题

MySQL 的 secure-file-priv 配置用于控制 LOAD DATA INFILE 等语句能操作的文件路径,若配置为特定路径或限制严格,会导致无法从指定路径导入文件。需要调整配置或者采用其他方式绕过该限制 。

(二)表结构修改主键重复定义问题

在修改 id 字段默认值时,不能同时重复定义主键(主键已存在),需要分步骤先设置默认值,再确保主键约束正常 。

(三)整体解决思路

  1. 先处理 secure-file-priv 限制,可通过修改 MySQL 配置、使用 LOAD DATA LOCAL INFILE 或者借助数据库管理工具(如 Navicat)导入来绕过 。
  2. 正确修改表结构,为 id 字段设置默认值 UUID() ,保证主键约束正常 。
  3. 验证导入和表结构修改是否成功,确保数据能正确入库 。

三、详细解决步骤

(一)解决 secure-file-priv 限制(以修改配置为例,最彻底方案)

  1. 找到 MySQL 配置文件

    • Windows 系统:一般在 MySQL 安装目录下(如 C:\ProgramData\MySQL\MySQL Server X.X ,ProgramData 为隐藏文件夹),文件名为 my.ini 。
    • Linux 系统:常见位置有 /etc/my.cnf 、/etc/mysql/my.cnf 等,可通过 sudo find / -name my.cnf 查找 。
  2. 修改 secure-file-priv 配置
    在配置文件的 [mysqld] 部分添加或修改:

ini

[mysqld]
secure-file-priv = "D:/"  # 允许 D 盘路径导入(可根据实际需求设置更严格路径)
  • 若测试环境想宽松些,可设为 secure-file-priv = "" ,允许所有路径,但生产环境不推荐 。我这里设置了没有用
  1. 重启 MySQL 服务

    • Windows:在服务管理器中找到 MySQL 服务,右键重启 。
    • Linux:执行 sudo systemctl restart mysql 命令重启 。
  2. 验证配置
    登录 MySQL 执行:

sql

SHOW VARIABLES LIKE 'secure_file_priv';

返回设置的路径则配置生效 。

(二)正确修改表结构设置 id 默认值

  1. 设置 id 字段默认值
    执行语句修改 id 字段,添加 UUID() 作为默认值,由于原表 id 已是主键,无需重复定义:

sql

ALTER TABLE logistics_company 
MODIFY COLUMN id VARCHAR(36) NOT NULL COMMENT '主键' 
DEFAULT (UUID());

此语句作用是让插入数据时,若未显式指定 id ,则自动用 UUID() 生成值,同时保留已有的主键约束 。

  1. (可选)确认主键约束
    一般无需额外操作,因为主键约束之前已存在。若想重新确认,可执行(实际场景很少这样做,仅示例):

sql

-- 先删除原主键(若需修改主键相关属性,实际很少用)
ALTER TABLE logistics_company 
DROP PRIMARY KEY,
-- 重新添加主键约束
ADD CONSTRAINT pk_logistics_company_id PRIMARY KEY (id);

正常情况下,第一步执行完,id 字段就既有主键约束又有默认 UUID() 生成值的功能了 。

(三)使用 LOAD DATA INFILE 重新导入数据(配置生效后)

sql

LOAD DATA INFILE 'D:/微信/文件/WeChat Files/wxid_v1916x2ct1t122/FileStorage/File/2025-08/副本快递100快递公司标准编码-20250805112038.csv'
INTO TABLE logistics_company
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS 
(company_name, company_no, company_type)
SET 
  id = UUID(),  -- 利用默认值生成规则,也可直接写 DEFAULT ,效果一样
  delete_flag = 'normal',  
  create_by = 'liuqiang',  
  create_date= CURRENT_TIMESTAMP,
  update_date= CURRENT_TIMESTAMP,
  update_by = 'liuqiang', 
  versions = 1; 

此时因为 secure-file-priv 配置已调整,且 id 字段默认值设置正确,能正常导入数据,id 会自动生成 UUID 。

(四)验证结果

  1. 查看表结构
    执行 DESCRIBE logistics_company; 或者 SHOW CREATE TABLE logistics_company; ,查看 id 字段:

sql

DESCRIBE logistics_company;

输出中 id 字段的 Default 列应显示 (UUID()) (不同版本显示可能有差异),Key 列显示 PRI ,表示主键约束和默认值设置正常 。

  1. 查看导入数据
    执行 SELECT * FROM logistics_company; ,查看导入的数据:

  • id 字段应有自动生成的 UUID 值(如 6f9e2b8a-1c3d-4567-89ab-cdef01234567 格式 )。
  • 其他字段(company_name 、company_no 等)应正确显示导入的内容,且 delete_flag 为 normal 等符合 SET 语句设置的值 。

四、其他绕过 secure-file-priv 限制的方法(备用方案)

(一)使用 LOAD DATA LOCAL INFILE

  1. 客户端开启支持

    • MySQL 命令行:登录时加 --local-infile 参数,如 mysql --local-infile -u 用户名 -p 数据库名 。
    • Navicat:右键连接 →「编辑连接」→「高级」→ 勾选 Enable Local Infile 。
  2. 服务端开启 local_infile
    登录 MySQL 执行:

sql

SET GLOBAL local_infile = ON;

(此设置重启后失效,若需永久生效,需在 my.ini/my.cnf 的 [mysqld] 部分添加 local_infile = ON 并重启服务 )

  1. 执行导入语句

sql

LOAD DATA LOCAL INFILE 'D:/微信/文件/WeChat Files/wxid_v1916x2ct1t122/FileStorage/File/2025-08/副本快递100快递公司标准编码-20250805112038.csv'
INTO TABLE logistics_company
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS 
(company_name, company_no, company_type)
SET 
  id = UUID(),  
  delete_flag = 'normal',  
  create_by = 'liuqiang',  
  create_date= CURRENT_TIMESTAMP,
  update_date= CURRENT_TIMESTAMP,
  update_by = 'liuqiang', 
  versions = 1; 

(二)使用 Navicat 图形化导入

  1. 打开 Navicat ,找到表,右键 →「导入向导」 。
  2. 选择「CSV 文件」,找到文件路径,设置编码(如 UTF-8 避免中文乱码 )、分隔符(逗号 , )等 。
  3. 映射字段,确保 company_name 、company_no 、company_type 对应正确,对于 id 等字段,设置默认值(如 UUID() ),然后执行导入 。

五、总结与注意事项

(一)总结

  1. 通过调整 secure-file-priv 配置、使用 LOAD DATA LOCAL INFILE 或者借助工具,可解决文件导入路径限制问题 。
  2. 分步骤修改表结构,能正确为 id 字段设置 UUID() 默认值,避免主键重复定义错误 。
  3. 验证表结构和导入数据,确保功能正常,数据能正确入库 。

(二)注意事项

  1. 修改 MySQL 配置文件后,务必重启服务使配置生效 。
  2. 使用 LOAD DATA LOCAL INFILE 时,要确保客户端和服务端都开启相应支持,否则无法成功导入 。
  3. 操作表结构修改和数据导入前,建议备份数据,避免误操作导致数据丢失或损坏 。
  4. 不同数据库管理工具(如 Navicat、DBeaver 等)操作细节有差异,需根据实际工具界面调整步骤 。

通过以上完整流程,可解决 LOAD DATA INFILE 导入及表结构修改过程中的系列问题,实现 CSV 文件数据顺利导入 logistics_company 表,同时让 id 字段自动生成 UUID 值 。你可根据实际环境选择合适的方案,若在操作中遇到其他报错,可结合具体错误信息进一步排查解决 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值