SQL语法随H2版本更新而更改



我在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 (00a  ID long [*]auto_increment,00a  TYPE VARCHAR(100) not null,00a  VALUE VARCHAR(100) not null,00a  SORT_ORDER int not null00a);00a00aCREATE 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;]
  1. SQL中没有long这样的数据类型,您在哪里找到的?您需要使用BIGINT。H2也接受long,但这取决于兼容模式,例如在PostgreSQL兼容模式中不允许
  2. AUTO_INCREMENT也应该只在MySQL和MariaDB兼容模式中使用,H2也接受REGULAL和LEGACY模式,但通常需要使用GENERATED BY DEFAULT AS IDENTITY
  3. VALUE是H2中的关键字,也是SQL标准中的保留字(即使在过时的SQL-92中也是如此(。您不能在没有引号的情况下将其用作标识符,您需要根据需要的大小写为"VALUE""value"(默认情况下,带引号的标识符区分大小写(。实际上有一个兼容性设置,您可以将;NON_KEYWORDS=VALUE添加到H2的JDBC URL中,但最好在脚本和应用程序中引用它

最新更新