SQL H2 版本更新的语法更改
SQL syntax change with H2 version update
我在 SpringBoot 应用程序测试中使用了以下 H2 DB 脚本:
create TABLE PARAMETER (
ID long auto_increment,
TYPE VARCHAR(100) not null,
VALUE VARCHAR(100) not null,
SORT_ORDER int not null
);
CREATE SEQUENCE PARAMETER_ID_SEQ MINVALUE 1 START WITH 1;
此脚本使用以前的 H2 版本 <h2.version>1.4.196</h2.version>
执行,但是当更新到 <h2.version>2.1.210</h2.version>
时出现以下错误,我无法理解问题所在。高版本有新语法吗?
错误:
Reason: liquibase.exception.DatabaseException: Syntax error in SQL statement "create TABLE PARAMETER ([=12=]0a ID long [*]auto_increment,[=12=]0a TYPE VARCHAR(100) not null,[=12=]0a VALUE VARCHAR(100) not null,[=12=]0a SORT_ORDER int not null[=12=]0a);[=12=]0a[=12=]0aCREATE SEQUENCE PARAMETER_ID_SEQ MINVALUE 1 START WITH 1;"; expected "RAW, ARRAY, INVISIBLE, VISIBLE, NOT, NULL, AS, DEFAULT, GENERATED, ON, NOT, NULL, DEFAULT, NULL_TO_DEFAULT, SEQUENCE, SELECTIVITY, COMMENT, CONSTRAINT, COMMENT, PRIMARY, UNIQUE, NOT, NULL, CHECK, REFERENCES, ,, )"; SQL statement:
create TABLE PARAMETER (
ID long auto_increment,
TYPE VARCHAR(100) not null,
VALUE VARCHAR(100) not null,
SORT_ORDER int not null
);
CREATE SEQUENCE PARAMETER_ID_SEQ MINVALUE 1 START WITH 1; [42001-210] [Failed SQL: (42001) create TABLE PARAMETER (
ID long auto_increment,
TYPE VARCHAR(100) not null,
VALUE VARCHAR(100) not null,
SORT_ORDER int not null
);
CREATE SEQUENCE PARAMETER_ID_SEQ MINVALUE 1 START WITH 1;]
- SQL中没有
long
这样的数据类型,你从哪里找到的?您需要使用 BIGINT
。 H2 也接受 long
,但它取决于兼容模式,例如,在 PostgreSQL 兼容模式中是不允许的。
AUTO_INCREMENT
也应该只在 MySQL 和 MariaDB 兼容模式下使用,H2 在 REGULAR 和 LEGACY 模式下也接受它,但通常你需要使用 GENERATED BY DEFAULT AS IDENTITY
.
VALUE
是 H2 中的关键字,也是 SQL 标准中的保留字(甚至在古老的 SQL-92 中)。您不能将其用作不带引号的标识符,您需要根据需要将其写为 "VALUE"
或 "value"
(带引号的标识符默认为 case-sensitive)。其实有一个兼容性设置,你可以在H2的JDBC URL中添加;NON_KEYWORDS=VALUE
,但是最好在你的脚本和应用程序中引用它。
我在 SpringBoot 应用程序测试中使用了以下 H2 DB 脚本:
create TABLE PARAMETER (
ID long auto_increment,
TYPE VARCHAR(100) not null,
VALUE VARCHAR(100) not null,
SORT_ORDER int not null
);
CREATE SEQUENCE PARAMETER_ID_SEQ MINVALUE 1 START WITH 1;
此脚本使用以前的 H2 版本 <h2.version>1.4.196</h2.version>
执行,但是当更新到 <h2.version>2.1.210</h2.version>
时出现以下错误,我无法理解问题所在。高版本有新语法吗?
错误:
Reason: liquibase.exception.DatabaseException: Syntax error in SQL statement "create TABLE PARAMETER ([=12=]0a ID long [*]auto_increment,[=12=]0a TYPE VARCHAR(100) not null,[=12=]0a VALUE VARCHAR(100) not null,[=12=]0a SORT_ORDER int not null[=12=]0a);[=12=]0a[=12=]0aCREATE SEQUENCE PARAMETER_ID_SEQ MINVALUE 1 START WITH 1;"; expected "RAW, ARRAY, INVISIBLE, VISIBLE, NOT, NULL, AS, DEFAULT, GENERATED, ON, NOT, NULL, DEFAULT, NULL_TO_DEFAULT, SEQUENCE, SELECTIVITY, COMMENT, CONSTRAINT, COMMENT, PRIMARY, UNIQUE, NOT, NULL, CHECK, REFERENCES, ,, )"; SQL statement:
create TABLE PARAMETER (
ID long auto_increment,
TYPE VARCHAR(100) not null,
VALUE VARCHAR(100) not null,
SORT_ORDER int not null
);
CREATE SEQUENCE PARAMETER_ID_SEQ MINVALUE 1 START WITH 1; [42001-210] [Failed SQL: (42001) create TABLE PARAMETER (
ID long auto_increment,
TYPE VARCHAR(100) not null,
VALUE VARCHAR(100) not null,
SORT_ORDER int not null
);
CREATE SEQUENCE PARAMETER_ID_SEQ MINVALUE 1 START WITH 1;]
- SQL中没有
long
这样的数据类型,你从哪里找到的?您需要使用BIGINT
。 H2 也接受long
,但它取决于兼容模式,例如,在 PostgreSQL 兼容模式中是不允许的。 AUTO_INCREMENT
也应该只在 MySQL 和 MariaDB 兼容模式下使用,H2 在 REGULAR 和 LEGACY 模式下也接受它,但通常你需要使用GENERATED BY DEFAULT AS IDENTITY
.VALUE
是 H2 中的关键字,也是 SQL 标准中的保留字(甚至在古老的 SQL-92 中)。您不能将其用作不带引号的标识符,您需要根据需要将其写为"VALUE"
或"value"
(带引号的标识符默认为 case-sensitive)。其实有一个兼容性设置,你可以在H2的JDBC URL中添加;NON_KEYWORDS=VALUE
,但是最好在你的脚本和应用程序中引用它。