H2版本升级后org.h2.jdbc.JdbcSQLSyntaxErrorException

RrR*_*rR- 10 java database h2

我最近将 h2 版本从 1.4.200 升级到 2.0.206。一些以前在旧版本中运行的查询在升级后无法正常运行。

CREATE TABLE SOMETABLE (
  ID INT(11) NOT NULL AUTO_INCREMENT,
  SOURCE_ID VARCHAR(255) NOT NULL,
  MESSAGE VARCHAR(255) NOT NULL,
  PRIMARY KEY (`ID`)
);
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE IF NOT EXISTS SOMEOTHERTABLE (
    ID VARCHAR(255) NOT NULL,
    NAME VARCHAR(255) NOT NULL,
    CREATED_TIME TIMESTAMP NOT NULL,
    LAST_MODIFIED TIMESTAMP NOT NULL,
    HAS_FILE BOOLEAN(1) NOT NULL,
    PRIMARY KEY (ID)
);
Run Code Online (Sandbox Code Playgroud)

对于这两个,我得到类似的错误

org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "  CREATE TABLE SOMETABLE ( ID INT([*]11) NOT NULL AUTO_INCREMENT, SOURCE_ID VARCHAR(255) NOT NULL, MESSAGE VARCHAR(255) NOT NULL, PRIMARY KEY (`ID`) )"; expected "ARRAY, INVISIBLE, VISIBLE, NOT, NULL, AS, DEFAULT, GENERATED, ON, NOT, NULL, AUTO_INCREMENT, DEFAULT, NULL_TO_DEFAULT, SEQUENCE, SELECTIVITY, COMMENT, CONSTRAINT, COMMENT, PRIMARY, UNIQUE, NOT, NULL, CHECK, REFERENCES, AUTO_INCREMENT, ., )";
Run Code Online (Sandbox Code Playgroud)
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "  CREATE TABLE IF NOT EXISTS SOMEOTHERTABLE ( ID VARCHAR(255) NOT NULL, NAME VARCHAR(255) NOT NULL, CREATED_TIME TIMESTAMP NOT NULL, LAST_MODIFIED TIMESTAMP NOT NULL, HAS_FILE BOOLEAN([*]1) NOT NULL, PRIMARY KEY (ID) )"; expected "ARRAY, INVISIBLE, VISIBLE, NOT, NULL, AS, DEFAULT, GENERATED, ON, NOT, NULL, AUTO_INCREMENT, DEFAULT, NULL_TO_DEFAULT, SEQUENCE, SELECTIVITY, COMMENT, CONSTRAINT, COMMENT, PRIMARY, UNIQUE, NOT, NULL, CHECK, REFERENCES, AUTO_INCREMENT, ., )";
Run Code Online (Sandbox Code Playgroud)

看来在这两种情况下,拥有INT(11)BOOLEAN(1)就是问题所在。新版本中不再允许这些了吗?如果是这样,我应该如何改变这些?任何与此相关的帮助将不胜感激。

小智 9

将 h2 版本从 1.4.200 更新到 2.0.206 时,我遇到了同样的问题。该项目基于Spring Boot并使用Hibernate。

就我而言,问题是,我有一个实体,其中的字段引用名为“VALUE”的表列。

@Column(name = "VALUE")
private BigDecimal value;
Run Code Online (Sandbox Code Playgroud)

根据文档https://h2database.com/html/advanced.html#keywords,VALUE是保留关键字。将列引用“VALUE”更改为“VALUE1”之类的内容解决了该问题。


Evg*_*nov 5

为什么会有这样的定义?H2 1.4.200 的文档不允许这些数据类型的任何参数。

INT(11)仅在 MySQL 和 MariaDB 兼容模式下允许,但指定的精度会被 H2 忽略。该定义在H2 2.0中的所有其他兼容模式中被拒绝,您需要使用INTINTEGER

BOOLEAN(1)根本不允许,如果它在 1.4.200 中工作,那么它是解析器中的一个错误。你需要使用BOOLEAN.

AUTO_INCREMENT子句通常也应该仅在 MySQL 和 MariaDB 兼容模式下使用,但它也可以在常规模式下使用。正确的子句是主键和标识列不需要GENERATED BY DEFAULT AS IDENTITY显式约束,您可以将其删除。NOT NULL通常还应该在所有其他子句之后、H2 实际接受身份选项之前指定约束NOT NULL,但这种错误的子句顺序没有记录并且不受支持。