先说总结吧,还是Navicat图形化工具好用,对于导入数据来说
- 我是先将excel转化成.csv文件格式
- 然后通过Navicat找到表,右键 →「导入向导」
- 选择文件:
- 选择对应字段名:
- 如果上边字段名显示的是乱码,那就去看看你的csv文件是不是utf-8编码,如果不是修改过来就可以
- 选择导入的模式:
- 然后点击开始就行了
只想看如何导入的可以不用往下看
下边就是我刚开始试图采用的sql语句导入方式
一、问题场景与初始报错
(一)需求背景
想要通过 LOAD DATA INFILE
语句将存储快递公司信息的 CSV 文件导入到 logistics_company
表中,同时对表结构进行调整,让 id
字段能自动生成 UUID 作为默认值,过程中遇到了一系列报错,需要逐步解决。
(二)初始操作与报错
- 执行
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没有设置默认值,所以导入数据报错了,所以我修改表结构
- 尝试修改表结构设置
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
字段默认值时,不能同时重复定义主键(主键已存在),需要分步骤先设置默认值,再确保主键约束正常 。
(三)整体解决思路
- 先处理
secure-file-priv
限制,可通过修改 MySQL 配置、使用LOAD DATA LOCAL INFILE
或者借助数据库管理工具(如 Navicat)导入来绕过 。 - 正确修改表结构,为
id
字段设置默认值UUID()
,保证主键约束正常 。 - 验证导入和表结构修改是否成功,确保数据能正确入库 。
三、详细解决步骤
(一)解决 secure-file-priv
限制(以修改配置为例,最彻底方案)
-
找到 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
查找 。
- Windows 系统:一般在 MySQL 安装目录下(如
-
修改
secure-file-priv
配置
在配置文件的[mysqld]
部分添加或修改:
ini
[mysqld]
secure-file-priv = "D:/" # 允许 D 盘路径导入(可根据实际需求设置更严格路径)
- 若测试环境想宽松些,可设为
secure-file-priv = ""
,允许所有路径,但生产环境不推荐 。我这里设置了没有用
-
重启 MySQL 服务
- Windows:在服务管理器中找到
MySQL
服务,右键重启 。 - Linux:执行
sudo systemctl restart mysql
命令重启 。
- Windows:在服务管理器中找到
-
验证配置
登录 MySQL 执行:
sql
SHOW VARIABLES LIKE 'secure_file_priv';
返回设置的路径则配置生效 。
(二)正确修改表结构设置 id
默认值
- 设置
id
字段默认值
执行语句修改id
字段,添加UUID()
作为默认值,由于原表id
已是主键,无需重复定义:
sql
ALTER TABLE logistics_company
MODIFY COLUMN id VARCHAR(36) NOT NULL COMMENT '主键'
DEFAULT (UUID());
此语句作用是让插入数据时,若未显式指定 id
,则自动用 UUID()
生成值,同时保留已有的主键约束 。
- (可选)确认主键约束
一般无需额外操作,因为主键约束之前已存在。若想重新确认,可执行(实际场景很少这样做,仅示例):
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 。
(四)验证结果
- 查看表结构
执行DESCRIBE logistics_company;
或者SHOW CREATE TABLE logistics_company;
,查看id
字段:
sql
DESCRIBE logistics_company;
输出中 id
字段的 Default
列应显示 (UUID())
(不同版本显示可能有差异),Key
列显示 PRI
,表示主键约束和默认值设置正常 。
- 查看导入数据
执行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
-
客户端开启支持
- MySQL 命令行:登录时加
--local-infile
参数,如mysql --local-infile -u 用户名 -p 数据库名
。 - Navicat:右键连接 →「编辑连接」→「高级」→ 勾选
Enable Local Infile
。
- MySQL 命令行:登录时加
-
服务端开启
local_infile
登录 MySQL 执行:
sql
SET GLOBAL local_infile = ON;
(此设置重启后失效,若需永久生效,需在 my.ini
/my.cnf
的 [mysqld]
部分添加 local_infile = ON
并重启服务 )
- 执行导入语句
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 图形化导入
- 打开 Navicat ,找到表,右键 →「导入向导」 。
- 选择「CSV 文件」,找到文件路径,设置编码(如
UTF-8
避免中文乱码 )、分隔符(逗号,
)等 。 - 映射字段,确保
company_name
、company_no
、company_type
对应正确,对于id
等字段,设置默认值(如UUID()
),然后执行导入 。
五、总结与注意事项
(一)总结
- 通过调整
secure-file-priv
配置、使用LOAD DATA LOCAL INFILE
或者借助工具,可解决文件导入路径限制问题 。 - 分步骤修改表结构,能正确为
id
字段设置UUID()
默认值,避免主键重复定义错误 。 - 验证表结构和导入数据,确保功能正常,数据能正确入库 。
(二)注意事项
- 修改 MySQL 配置文件后,务必重启服务使配置生效 。
- 使用
LOAD DATA LOCAL INFILE
时,要确保客户端和服务端都开启相应支持,否则无法成功导入 。 - 操作表结构修改和数据导入前,建议备份数据,避免误操作导致数据丢失或损坏 。
- 不同数据库管理工具(如 Navicat、DBeaver 等)操作细节有差异,需根据实际工具界面调整步骤 。
通过以上完整流程,可解决 LOAD DATA INFILE
导入及表结构修改过程中的系列问题,实现 CSV 文件数据顺利导入 logistics_company
表,同时让 id
字段自动生成 UUID 值 。你可根据实际环境选择合适的方案,若在操作中遇到其他报错,可结合具体错误信息进一步排查解决 。