bigywater.tech
Spring · 181

ddl-auto=validate 报 Schema validation 错误:缺表、缺列、类型不一致各是什么提示,update 会改列类型吗

ddl-auto=validate 启动报 Schema validation 是什么意思?缺表、缺列、类型不一致各提示什么?update 会不会改已有列的类型,数据转不了会怎样?这篇用自己起的 MySQL 在 Spring Boot 4.0.8 上逐个试。

3 种提示
validate 缺表 missing table、缺列 missing column、类型不一致 wrong column type encountered,后者同时给出 found 和 expecting
update 会改类型
age 是 varchar(10) 的空表,update 把它 alter 成 int;已有一行 abc 时 alter 失败,只打 WARN,启动照常
不检查的东西
validate 不报多余的列,也不报 varchar(10) 对默认长度 255 的差异

缺表

实测 · 本机执行输出
  启动前的表:(表不存在);ddl-auto = validate
  启动失败:SchemaManagementException:Schema validation: missing table [person]
  运行后的表:(表不存在)

missing table [person]。

缺列

实测 · 本机执行输出
  启动前的表:id bigint, name varchar(255);ddl-auto = validate
  启动失败:SchemaManagementException:Schema validation: missing column [age] in table [person]
  运行后的表:id bigint, name varchar(255)

missing column [age] in table [person]。

类型不一致

实测 · 本机执行输出
  启动前的表:id bigint, name varchar(255), age varchar(10);ddl-auto = validate
  启动失败:SchemaManagementException:Schema validation: wrong column type encountered in column [age] in table [person]; found [varchar (Types#VARCHAR)], but expecting [integer (Types#INTEGER)]
  运行后的表:id bigint, name varchar(255), age varchar(10)

found 与 expecting 同时给出。

int 对 bigint

实测 · 本机执行输出
  启动前的表:id int, name varchar(255), age int;ddl-auto = validate
  启动失败:SchemaManagementException:Schema validation: wrong column type encountered in column [id] in table [person]; found [int (Types#INTEGER)], but expecting [bigint (Types#BIGINT)]
  运行后的表:id int, name varchar(255), age int

整型宽度不同也算不一致。

不检查的

实测 · 本机执行输出
  启动前的表:id bigint, name varchar(10), age int, nick varchar(20);ddl-auto = validate
  启动成功
  启动后 select count(p) from Person p → 0
  运行后的表:id bigint, name varchar(10), age int, nick varchar(20)

多余列、长度差异都不报。

update

实测 · 本机执行输出
  启动前的表:id bigint, name varchar(255);ddl-auto = update
  启动成功
  启动后 select count(p) from Person p → 0
  运行后的表:id bigint, name varchar(255), age int
  -- update,age 列类型不对(varchar(10))
  启动前的表:id bigint, name varchar(255), age varchar(10);ddl-auto = update
  启动成功
  启动后 select count(p) from Person p → 0
  运行后的表:id bigint, name varchar(255), age int
  -- update,age 列类型不对(varchar(10))且已有一行 age = abc
  启动前的表:id bigint, name varchar(255), age varchar(10);ddl-auto = update
  启动成功
  启动后 select count(p) from Person p → 1
  日志里 Hibernate 的 WARN 有 1 条;第一条:WARN o.h.t.s.i.ExceptionHandlerLoggedImpl - GenerationTarget encountered exception accepting command : Error executing DDL "alter table person modify column age integer" via JDBC [Incorrect integer value: 'abc' for column 'age' at row 1]
  运行后的表:id bigint, name varchar(255), age varchar(10);age 的值:(('abc',),)
  -- update,表不存在
  启动前的表:(表不存在);ddl-auto = update
  启动成功
  启动后 select count(p) from Person p → 0
  运行后的表:id bigint, age int, name varchar(255)

补列、建表、改类型;转不了只 WARN。

none

实测 · 本机执行输出
  启动前的表:(表不存在);ddl-auto = none
  启动成功
  启动后查询失败:SQLGrammarException ← SQLSyntaxErrorException:Table 'demo.person' doesn't exist
  日志里 Hibernate 的 WARN 有 2 条;第一条:WARN org.hibernate.orm.jdbc.error - HHH000247: ErrorCode: 1146, SQLState: 42S02
  运行后的表:(表不存在)

第一次查询才失败。

create-drop

实测 · 本机执行输出
  启动前的表:id bigint, name varchar(255), legacy int;ddl-auto = create-drop
  启动成功
  启动后 select count(p) from Person p → 0
  运行后的表:(表不存在)

跑完后表不存在,旧表的 legacy 列也没了。

分步演示

DdlAuto
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / OpenJDK 21.0.12(Homebrew) / Spring Boot 4.0.8(Spring Framework 7.0.9、Tomcat 11.0.24) / Spring Cloud 2025.1.3;用 javac 编译、java 直接运行,依赖由 Maven 从 Maven Central 解析;数字每次运行会有小幅抖动(Spring Boot 4.0.8,Hibernate 7.2.24,MySQL 驱动 mysql-connector-j,自己起的 MySQL 实例;实体 Person 有 Long id(IDENTITY)、String name、Integer age;每个情形先用 SQL 重建 demo.person 表,启动应用,启动成功后再执行一次 select count(p) from Person p;表结构取自 information_schema.columns;Hibernate 的 WARN 通过 logback 打印)
    • 没有验证:PostgreSQL、H2 上 validate 的提示是否一致;@Column(length)、nullable 的差异为何不被 validate 检查;update 对 MySQL 之外数据库改列类型的行为;update 删除多余列的能力(只看到不删);Flyway、Liquibase 与 ddl-auto 同时存在时的先后;spring.jpa.generate-ddl 与 ddl-auto 的关系;Hibernate 的 schema validation 报错在 Boot 3.5 下的措辞
    京ICP备2026067502号-1京公网安备11010502063487号