H2 SQL 语句中是不是有语法错误?

Posted

技术标签:

【中文标题】H2 SQL 语句中是不是有语法错误?【英文标题】:Is there any wrong syntax in H2 SQL statement?H2 SQL 语句中是否有语法错误? 【发布时间】:2021-09-26 18:04:14 【问题描述】:

尝试使用内存中的 H2 DB 执行准备好的 SQL 语句。接收语法错误:

org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "INSERT INTO task7schema.courses (course_name) VALUES (?) returning[*] course_id;"; SQL statement:
INSERT INTO task7schema.courses (course_name) VALUES (?) returning course_id; [42000-200]

无法弄清楚语法有什么问题。任何帮助表示赞赏。

【问题讨论】:

这是否回答了您的问题:Return primary key value generated by default in H2 database upon INSERT of new row, for UUID type column?该示例用于返回 UUID - 但如果您不使用 UUID,我希望它可以适应您的情况。 感谢您的指导。我会尝试朝那个方向挖掘。我的初始架构脚本包含“SERIAL”关键字,它似乎是 postgres 特定的。 【参考方案1】:

H2 仅支持符合标准的语法:

SELECT course_id FROM FINAL TABLE
    (INSERT INTO task7schema.courses (course_name) VALUES (?));

您问题的语法是特定于 PostgreSQL 的。由于 PostgreSQL 不支持标准的数据变更增量表,因此您需要为 H2 和 PostgreSQL 使用不同的 SQL。

JDBC 有自己或多或少的可移植方式来请求生成的密钥。您可以从语句或准备好的语句中显式请求它们(使用附加的Statement.RETURN_GENERATED_KEYS 参数或通过指定列的名称或序号索引)并使用getGeneratedKeys() 读取它们。

【讨论】:

以上是关于H2 SQL 语句中是不是有语法错误?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 语句 org.h2.jdbc.JdbcSQLException 中的语法错误:

org.h2.jdbc.JdbcSQLSyntaxErrorException:SQL 语句“CREATE[*] SCHEMA DATABASE”中的语法错误; SQL 语句:

SQL 语句“WITH”关键字中的语法错误

sql-maven-plugin 为 H2 存储过程定义抛出 SQL 语法错误

如何定义隐式列名的 H2 语法问题

INSERT INTO 语句的语法错误