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;]
  1. SQL中没有long这样的数据类型,你从哪里找到的?您需要使用 BIGINT。 H2 也接受 long,但它取决于兼容模式,例如,在 PostgreSQL 兼容模式中是不允许的。
  2. AUTO_INCREMENT 也应该只在 MySQL 和 MariaDB 兼容模式下使用,H2 在 REGULAR 和 LEGACY 模式下也接受它,但通常你需要使用 GENERATED BY DEFAULT AS IDENTITY.
  3. VALUE 是 H2 中的关键字,也是 SQL 标准中的保留字(甚至在古老的 SQL-92 中)。您不能将其用作不带引号的标识符,您需要根据需要将其写为 "VALUE""value"(带引号的标识符默认为 case-sensitive)。其实有一个兼容性设置,你可以在H2的JDBC URL中添加;NON_KEYWORDS=VALUE,但是最好在你的脚本和应用程序中引用它。