Spring Boot 1.5.9重启执行schema.sql致表已存在启动失败求解决方案
解决方案:Spring Boot 1.5.9 每次重启通过schema.sql重建MySQL架构
针对你遇到的问题——重启应用时schema.sql重复执行导致表已存在启动失败,而Hibernate的ddl-auto配置又不生效的情况,我给你几个实用的解决思路:
为什么spring.jpa.hibernate.ddl-auto=create-drop没用?
你猜的没错,这个配置确实只针对Hibernate实体类映射的表生效。因为你完全依赖原生的schema.sql脚本初始化数据库,没有通过实体类和Hibernate关联,所以这个配置对你的场景不起作用,这是正常现象。
最简单的解决方法:修改schema.sql脚本
既然Spring Boot每次启动都会执行schema.sql(1.5.9版本默认开启spring.datasource.initialize=true),那我们可以在脚本里先清理旧表,再创建新表,从根源避免“表已存在”的错误。
步骤1:给每个表添加删除语句
在CREATE TABLE前加上DROP TABLE IF EXISTS,示例如下:
-- 先删除已存在的表(如果有) DROP TABLE IF EXISTS batch_job_instance; DROP TABLE IF EXISTS batch_job_execution; -- 这里可以继续添加你所有需要重建的表 -- 然后创建新表 CREATE TABLE batch_job_instance ( JOB_INSTANCE_ID BIGINT PRIMARY KEY , VERSION BIGINT , JOB_NAME VARCHAR(100) NOT NULL, JOB_KEY VARCHAR(32) NOT NULL, constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) ) ENGINE=InnoDB; CREATE TABLE batch_job_execution ( JOB_EXECUTION_ID BIGINT PRIMARY KEY , VERSION BIGINT , JOB_INSTANCE_ID BIGINT NOT NULL, CREATE_TIME DATETIME NOT NULL, START_TIME DATETIME DEFAULT NULL , END_TIME DATETIME DEFAULT NULL , STATUS VARCHAR(10) , EXIT_CODE VARCHAR(2500) , EXIT_MESSAGE VARCHAR(2500) , LAST_UPDATED DATETIME, JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) references batch_job_instance(JOB_INSTANCE_ID) ) ENGINE=InnoDB;
步骤2:处理外键约束问题
如果你的表之间有外键关联,直接删除可能会报错,这时候可以先临时禁用外键检查,删除完成后再恢复:
-- 禁用外键检查 SET FOREIGN_KEY_CHECKS = 0; -- 批量删除所有需要重建的表 DROP TABLE IF EXISTS batch_step_execution_context; DROP TABLE IF EXISTS batch_job_execution_context; DROP TABLE IF EXISTS batch_step_execution; DROP TABLE IF EXISTS batch_job_execution; DROP TABLE IF EXISTS batch_job_instance; -- 恢复外键检查 SET FOREIGN_KEY_CHECKS = 1; -- 后续正常创建所有表...
确认配置生效
确保你的application.properties里没有禁用初始化配置(1.5.9版本默认是开启的,不过显式配置更保险):
# 确保启用SQL脚本初始化 spring.datasource.initialize=true
这样每次重启应用时,Spring Boot会自动执行修改后的schema.sql,先清空旧表再创建新表,完美实现“每次重启重建数据库架构”的需求。
内容的提问来源于stack exchange,提问作者ITisha




