加--no-create-info仅跳过create/drop表语句,但保留use和set等上下文语句,若目标库或表不存在,执行use或insert时即报error 1146。

mysqldump 加 --no-create-info 就能只导出数据,但默认仍含 USE 和 SET 语句——目标库不存在或表未建好时,导入直接报错 ERROR 1146 (42S02): Table 'xxx' doesn't exist。
为什么加了 --no-create-info 还会报错?
因为 --no-create-info 只跳过 CREATE TABLE、DROP TABLE 等 DDL,但不屏蔽 USE `db_name` 和 SET 开头的上下文语句。这些语句本身不是“表结构”,却是执行 INSERT 的前提。
- 如果目标库不存在,
USE db_name先失败,后续所有INSERT都不执行 - 如果目标库存在但没建对应表,
INSERT INTO table_name直接触发ERROR 1146 -
--skip-comments和--skip-triggers能减少干扰,但不能解决核心依赖问题
只导纯 INSERT 的最小安全组合
要得到真正“拿来就能往已有表里灌”的 SQL,必须控制输出干净度:
- 用
--no-create-info(或简写-t)去掉建表语句 - 加
--skip-extended-insert把批量插入拆成单条INSERT,方便定位某一行失败 - 加
--compact去掉默认注释和空行,但调试时建议先去掉它——否则警告被隐藏 - 显式指定
--default-character-set=utf8mb4,避免字段内容因字符集不匹配被截断或乱码
完整命令示例:mysqldump -u root -p --no-create-info --skip-extended-insert --compact --default-character-set=utf8mb4 mydb users > users_data.sql
导入前必须确认的三件事
只导数据 ≠ 随便导入,漏掉任何一项都可能失败:
- 目标数据库必须已存在,且名称与导出时一致(
USE语句会尝试切换过去) - 目标表必须已存在,且字段名、类型、顺序、主键/自增设置与原表完全一致
- 如果原表有自增主键,且你希望保留原始 ID,确保导入时没加
--insert-ignore或--replace,否则可能跳过冲突行或覆盖已有记录
常见错误现象与应对
导入时报错 ERROR 1146 是最典型信号,说明表缺失;但还有些隐性坑:
- 导入后数据量比预期少:可能是字符集不匹配导致某些行解析失败,静默跳过
- 自增 ID 从 1 开始重排:没关
auto_increment或没在导入前设SET @AUTO_INCREMENT = xxx - 中文变问号或乱码:导出时没加
--default-character-set=utf8mb4,或目标表字符集是utf8(非utf8mb4) - 文件开头有 warning 行:MySQL 5.7+ 对明文密码提示警告,该行会导致导入语法错误,需手动
sed -i '1d' users_data.sql删除
真正麻烦的不是命令怎么写,而是“只导数据”这件事天然依赖外部环境——表得先建好,库得先存在,字符集得对齐,ID 约束得兼容。缺一不可。











