背景:开发中遇到一个问题,接过来一个项目,有俩 DDL,然后发现了问题,最后一个是最新建表语句,但是没有插入语句,第一个有插入语句但是不是最新的建表语句

解决思路:
如果有多个表,手动复制粘贴 INSERT 语句不仅慢,而且因为新老表结构(字段数量)不一样,很容易报错。
这里有一个最快、最稳妥 的"移花接木"方案。你需要创建两个临时数据库来做中转。
请按以下步骤操作(假设你使用的是 Navicat 或类似的数据库工具,IDEA 自带的 Database 工具也可以):
第一步:准备两个数据库
为了不弄乱,我们在本地 MySQL 里新建两个库:
db_old(旧库):用来装eladmin.sql(有数据,但结构老)。db_new(新库):用来装admin-boot...202409.sql(结构最新,但没数据)。
第二步:分别导入 SQL
- 在
db_old里运行eladmin.sql。- 结果:表都有数据,但字段可能缺胳膊少腿。
- 在
db_new里运行admin-boot...202409.sql。- 结果:表结构是最完美的,但里面是空的。
第三步:数据传输 (核心操作)
现在的任务就是:把 db_old 里的数据,灌入 db_new 的壳子里。
方法 A:如果你用 Navicat (推荐,最无脑)
- 打开 Navicat,点击顶部菜单的 工具 (Tools) -> 数据传输 (Data Transfer)。
- 源 (Source) :选择
db_old。 - 目标 (Target) :选择
db_new。 - 关键设置 (非常重要):
- 在"选项"里,取消勾选"创建表" (Create Tables)。(我们不要它覆盖新结构)
- 勾选"插入数据" (Insert Data)。
- 处理模式:选择"追加" (Append) 或 "替换" (Replace)。
- 点击开始。
- 原理 :Navicat 会尝试按字段名匹配。
- 如果
db_new多了个字段(比如new_col),它会填默认值(NULL)。 - 如果
db_new少了个字段(比如old_col),它会自动丢弃旧数据里的这个字段。 - 这样就完美解决了结构不一致的问题。
方法 B:如果你只用 IDEA
- 在 IDEA 右侧 Database 面板,连接上
db_old。 - 按住 Shift 选中所有表 -> 右键 -> Export Data to File (导出数据到文件)。
- Extractor (导出格式) 选择:SQL - Insert。
- 导出到一个文件
all_data.sql。 - 打开这个
all_data.sql,尝试在db_new里运行。- 缺点 :如果
INSERT语句里指定了列名还好;如果没指定列名且列数对不上,会报错,你可能需要手动删减几个报错表的语句。
- 缺点 :如果
第四步:收尾
- 传输完成后,你的
db_new现在就是 "新结构 + 旧数据" 的完全体了。 - 回到你的 Spring Boot 项目配置文件 (
application.yml)。 - 把数据库连接地址改成连接
db_new。 - 启动后端,这下应该既不报错,又有数据了。
⚠️ 重点检查对象
数据导过去后,重点看下这几个表,只要它们没问题,系统就能跑:
sys_user(用户)sys_role(角色)sys_menu(菜单 - 这个最重要,结构变了菜单可能加载不出来)sys_users_roles(关联表)
如果 sys_menu 报错,建议直接在 db_new 里手动清空 sys_menu,然后找一份最新的 ELAdmin 菜单 SQL 重新导入(因为菜单结构变化往往最大)。