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

org.h2.jdbc.JdbcSQLSyntaxErrorException after H2 version upgrade

我最近将 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`)
);
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)
);

对于这两个,我都会遇到类似的错误

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, ., )";
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, ., )";

似乎在这两种情况下,INT(11)BOOLEAN(1) 都是问题所在。新版本中不再允许使用这些吗?如果是这样,我应该如何改变这些?感谢您对此提供任何帮助。

为什么会有这样的定义? 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 约束,您可以将其删除。通常还应在所有其他子句之后指定约束,NOT NULL 在 H2 实际接受身份选项之前,但这种错误的子句顺序未记录且不受支持。

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

在我的例子中,问题是我有一个实体,该实体的字段引用了一个名为“VALUE”的 table 列。

@Column(name = "VALUE")
private BigDecimal value;

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