导出时未勾选“添加CREATE TABLE语句”导致主键缺失,因SQL文件仅含INSERT无建表逻辑;必须勾选该选项及“添加DROP TABLE语句”,并使用自定义导出、显式命名复合主键、避免快速模式。
导出时没勾“添加CREATE TABLE语句”导致主键彻底消失
phpmyadmin 导出时若未勾选「添加create table语句」,生成的 sql 文件里只有 insert into,没有建表逻辑——主键自然不存在。这不是数据丢了,是根本没导出结构。
常见现象:导入后表能查、能插,但 SHOW CREATE TABLE 里看不到 PRIMARY KEY,外键报错、ORM 映射失败。
- 导出页面必须勾选「添加CREATE TABLE语句」(在「对象创建选项」区域)
- 同时确认勾了「添加DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT语句」,否则旧表残留会干扰重建
- 如果只想要结构不导数据,选「仅结构」模式;混导结构+数据时,务必检查最终 SQL 文件开头是否有完整
CREATE TABLE
复合主键被降级为UNIQUE + NOT NULL
phpMyAdmin 对复合主键(如 PRIMARY KEY (user_id, role_id))支持较弱,尤其在老版本或未显式命名约束时,会把主键拆成两个独立约束:一个 UNIQUE 加多个 NOT NULL,丢失语义完整性。
后果是:外键引用失效、迁移工具无法识别主键关系、SELECT ... FOR UPDATE 行为异常。
- 导出后立即用文本编辑器搜索
PRIMARY KEY,确认括号内包含多个字段,而非单字段或压根没出现 - 建表时务必显式命名主键:
CONSTRAINT pk_user_role PRIMARY KEY (user_id, role_id),避免 phpMyAdmin 生成匿名名(如user_role_pkey) - 若已导出且主键被降级,手动编辑 SQL 文件,把对应
UNIQUE和NOT NULL替换为PRIMARY KEY (col_a, col_b)
导出用了“快速导出”模式,跳过元数据捕获
「快速导出」默认只抓数据,忽略表属性(包括主键、AUTO_INCREMENT、ENGINE 等)。即使你看到导出文件里有 CREATE TABLE,也可能缺关键定义。
立即学习“PHP免费学习笔记(深入)”;
典型表现:导入后 SHOW CREATE TABLE 显示 ENGINE=InnoDB DEFAULT CHARSET=utf8,而原表其实是 utf8mb4 或带 AUTO_INCREMENT=12345。
- 永远用「自定义导出」,滚动到「对象创建选项」区域,逐项确认:
- 勾选「添加CREATE TABLE语句」
- 勾选「添加AUTO_INCREMENT值」(该选项仅在「完整 INSERT 语句」启用后可见)
- 手动指定字符集为
utf8mb4,取消勾选「使用服务器默认排序规则」
目标表已存在且未先 DROP,旧结构覆盖新定义
导出文件虽含正确 CREATE TABLE,但若导入前目标表已存在,而你又没勾「添加DROP TABLE语句」,MySQL 就直接忽略建表语句——主键还是旧的。
错误信号:导入无报错,但查 SHOW CREATE TABLE 发现主键没变,或插入时报 #1062 Duplicate entry 却找不到对应约束。
- 导出时务必勾选「添加DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT语句」
- 导入前确认当前数据库上下文正确(phpMyAdmin 左侧导航栏高亮的是你要操作的库)
- 导入后立刻执行
SHOW CREATE TABLE `table_name`,比对是否与导出文件一致



















