需先选择数据库再导入,正确命令为 mysql -u root -p database_name < file.sql。
导入 SQL 文件时报错 “No database selected”
直接执行 mysql -u root -p 时,如果 <code>dump.sql 里没带 use 语句,mysql 就不知道该往哪个库写数据,立刻报这个错。不是权限问题,也不是路径问题,纯粹是上下文缺失。
常见错误现象:
• 报错信息明确是 No database selected
• dump.sql 用 mysqldump --no-databases 或手动删过开头的 USE 行
• 在 phpMyAdmin 或 MySQL Workbench 里点“导入”也失败,但提示更模糊(比如“无法执行第一条语句”)
- 最稳妥的做法:在 SQL 文件最开头插入一行
USE database_name;(注意分号不能少) - 别插在注释块中间,也别插在
CREATE TABLE后面——必须是文件第一行可执行语句(注释可以放在它前面) - 如果数据库名含特殊字符(比如中划线),要加反引号:
USE `my-db`; - 不推荐用
mysql -D database_name -u root -p 代替——某些旧版客户端或管道场景下,<code>-D不会透传到所有子语句,尤其遇到DROP TABLE后再CREATE时容易失效
mysqldump 导出时漏掉 USE 语句的原因
默认情况下 mysqldump 是带 USE 的,但以下几种操作会干掉它:
- 用了
--no-create-db参数(常和--skip-triggers一起用) - 导出多个库时加了
--databases,但后续手动删了开头的CREATE DATABASE和USE行 - 用文本工具“清理” SQL 文件时,误删了第一行非空行
验证方法:用 head -n 5 dump.sql 看前五行,正常应有类似 USE `xxx`; 或 CREATE DATABASE IF NOT EXISTS `xxx`;。没有?那就得补。
批量修复多个 SQL 文件的 USE 语句
手动一个一个改太慢,尤其部署脚本里一堆 dump 文件时。可以用 shell 快速注入:
sed -i '1s/^/USE `myapp_prod`;\n/' *.sql
说明:
-
1s表示只操作第 1 行;^是行首锚点;\n换行确保USE单独成行 - 如果文件已有
USE但写错了库名,先用grep -l "USE" *.sql找出来,再针对性替换 - Windows 下用 PowerShell:`(Get-Content a.sql) | ForEach-Object { if ($_.ReadCount -eq 1) { "USE `mydb`;"; $_ } else { $_ } } | Set-Content a.sql`
- 别对压缩包里的 .sql 直接操作——先解压,改完再打包,否则 zip 内部偏移会错乱
为什么有些工具不报错,有些却卡住?
行为差异主要来自客户端解析逻辑:
-
mysql命令行客户端:严格按顺序执行,没USE就拒绝后续所有 DDL/DML - phpMyAdmin:会尝试提取第一个
CREATE TABLE的库名自动补USE,但遇到INSERT INTO db1.table1这种全限定名就懵,可能只建表不插数据 - Navicat:默认启用“忽略 USE 语句”,但一旦勾选了“执行前切换数据库”,就会强制校验,反而暴露问题
- Python 的
mysql-connector-python执行多语句时,若没显式调用cursor.execute("USE db"),也会在第一条CREATE失败
真正容易被忽略的是:SQL 文件里混用全库名和裸表名(比如 INSERT INTO mydb.users 和 CREATE TABLE logs 并存),这种文件即使加了 USE 也可能部分语句走错库——得统一表名写法,或者用 mysql --force 强制继续,但后果自负。










