【问题标题】:org.h2.jdbc.JdbcSQLSyntaxErrorException after H2 version upgradeH2版本升级后org.h2.jdbc.JdbcSQLSyntaxErrorException
【发布时间】:2022-01-13 10:28:22
【问题描述】:

我最近将 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) 似乎都是问题所在。这些在新版本中不再允许了吗?如果是这样,我应该如何改变这些?对此的任何帮助表示赞赏。

【问题讨论】:

    标签: java database h2


    【解决方案1】:

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

    INT(11) 仅在 MySQL 和 MariaDB 兼容模式下允许使用,但 H2 会忽略指定的精度。这个定义在H2 2.0所有其他兼容模式下都被拒绝了,需要使用INT或者INTEGER

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

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

    【讨论】:

    • 这些是我们组织中的一些非常古老的代码,并且在旧版本的 h2 中以某种方式允许使用。感谢您的意见!
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2021-08-16
      • 2022-07-22
      • 1970-01-01
      相关资源
      最近更新 更多