You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动