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 中的所有其他兼容模式都拒绝此定义,您需要使用 INT
或 INTEGER
.
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”之类的内容解决了这个问题。
我最近将 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 中的所有其他兼容模式都拒绝此定义,您需要使用 INT
或 INTEGER
.
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”之类的内容解决了这个问题。