ddl-auto=validate 启动报 Schema validation 是什么意思?缺表、缺列、类型不一致各提示什么?update 会不会改已有列的类型,数据转不了会怎样?这篇用自己起的 MySQL 在 Spring Boot 4.0.8 上逐个试。
启动前的表:(表不存在);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 同时给出。
启动前的表: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)
多余列、长度差异都不报。
启动前的表: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。
启动前的表:(表不存在);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 运行后的表:(表不存在)
第一次查询才失败。
启动前的表:id bigint, name varchar(255), legacy int;ddl-auto = create-drop 启动成功 启动后 select count(p) from Person p → 0 运行后的表:(表不存在)
跑完后表不存在,旧表的 legacy 列也没了。