应跳过 PRIMARY KEY 和 AUTO_INCREMENT 定义以避免 ID 冲突:导出时用 --skip-triggers --compact --no-data 获取结构后手动删除相关约束;INSERT 语句须排除 id 字段;重置自增需先 DELETE 再 ALTER TABLE ... AUTO_INCREMENT = 1;LOAD DATA INFILE 用 @dummy 忽略 id 列。
导出时跳过 PRIMARY KEY 和 AUTO_INCREMENT 定义
mysql 的 mysqldump 默认会把建表语句连同主键、自增属性一起导出,这会导致目标库导入时 id 冲突或无法重置自增起点。关键不是“删数据”,而是“不导结构里的约束”。
- 用
--no-create-info跳过CREATE TABLE语句,只导数据(但这样没表结构,得另处理) - 更稳妥的是保留建表语句但剥离主键和自增:加
--skip-triggers --compact --no-data先导出表结构,再手动删掉PRIMARY KEY、AUTO_INCREMENT、NOT NULL(如果仅用于 ID 重分配,NOT NULL可留) - 数据导出本身不用改——
INSERT语句默认不显式写 ID 字段,只要列顺序对、值数量匹配,ID 就会被新库的自增逻辑接管
INSERT 语句里显式排除 id 字段
如果用 SELECT ... INTO OUTFILE 或程序拼 INSERT,最容易踩的坑是字段列表写全了,把 id 也包进去。一旦源数据 ID 值较大,导入时要么冲突,要么触发 Duplicate entry 错误。
- 务必确认
INSERT INTO t (col1, col2, ...)中不含id字段名 - 对应
VALUES部分也不能多给一个值;少一个值没关系,自增字段自动补位 - 用
SELECT col1, col2, ... FROM t构造数据,比SELECT *安全得多——后者在源表加字段后会悄悄带上新列,可能错位
目标库建表时禁用 AUTO_INCREMENT 再启用
直接在空表上执行 ALTER TABLE t AUTO_INCREMENT = 1 是无效的——它只影响下一次插入,不清理已存在的最大 ID。真正要重置,得先清空再设起始值,但又不能用 TRUNCATE(会重置自增计数器,但也会锁表、不可回滚)。
- 安全做法:先
DELETE FROM t,再ALTER TABLE t AUTO_INCREMENT = 1 - 注意:如果表有外键引用,
DELETE前得关掉FOREIGN_KEY_CHECKS,否则报错Cannot delete or update a parent row - 执行完
ALTER后,用SHOW CREATE TABLE t确认AUTO_INCREMENT值已更新,别信缓存
用 LOAD DATA INFILE 导入时忽略首列(ID 列)
当数据量大、用文本文件中转时,LOAD DATA INFILE 比批量 INSERT 快得多,但它默认按字段顺序严格映射。如果源文件第一列是 id,而目标表 ID 是自增的,就必须跳过它。
- 语法里用
@dummy占位:LOAD DATA INFILE '/path/data.csv' INTO TABLE t (@dummy, col1, col2)... - 确保
FIELDS TERMINATED BY和LINES TERMINATED BY与导出时一致,否则字段错位,@dummy就吞错列 - 如果文件没有表头,别加
IGNORE 1 LINES——它会跳过第一行数据,不是跳过第一列










