postgresql 兼容性中的语法错误 h2 数据库

Posted

技术标签:

【中文标题】postgresql 兼容性中的语法错误 h2 数据库【英文标题】:Syntax error h2 database in postgresql compatibility 【发布时间】:2020-07-07 15:38:26 【问题描述】:

当在 h2 数据库(兼容性 POSTGRESQL)中执行以下 sn-p 时,我遇到似乎由 h2 报告的语法错误:

org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "
                                                                      
             
                                                                      

ALTER TABLE ACTIVITIES
    ADD CONSTRAINT FK_ACT_NEXACTID FOREIGN KEY (NEXTACTIVITYID)
    REFERENCES ACTIVITIES (ID)
    DEFERRABLE INITIALLY[*] DEFERRED
 "; SQL statement:

----------------------------------------------------------------------
-- ACTIVITIES
----------------------------------------------------------------------

ALTER TABLE ACTIVITIES
    ADD CONSTRAINT FK_ACT_NEXACTID FOREIGN KEY (NEXTACTIVITYID)
    REFERENCES ACTIVITIES (ID)
    DEFERRABLE INITIALLY DEFERRED
 [42000-198]

SQL 状态为 42000,这是语法错误的代码。当我在本机 postgre 服务器上执行它时,它运行时没有错误。任何帮助表示赞赏。我在这里读到H2 - (Quite) long INSERT failing with error 42000 一些额外的字符可能是导致此问题的原因,但我没有看到任何问题。谢谢!

【问题讨论】:

【参考方案1】:

您正在使用 PostgreSQL 和其他一些 DMBS 支持的特定于供应商的语法。 H2 的兼容模式仅提供非常有限的与其他兼容模式。您应该使用与生产环境相同的 DBMS 来测试您的应用程序,尤其是当您想使用某些供应商特定的功能时。

如果您出于某种原因确实需要在此处使用 H2,则需要在使用 H2 时从命令中删除 DEFERRABLE INITIALLY DEFERRED,并且您的应用程序必须能够使用常规约束,因为 H2 不支持延期的。此外,1.4.198 是 H2 的 beta 质量版本,您不应在没有充分理由的情况下使用它,但目前的版本也不支持延迟约束。

【讨论】:

非常感谢您的快速回答! 你能告诉我在哪里可以找到这些限制吗? 这不是限制。 H2 不是 PostgreSQL 的模拟器。兼容性模式的文档清楚地描述了仅支持一些偏差和特定于供应商的功能。 h2database.com/html/features.html#compatibility

以上是关于postgresql 兼容性中的语法错误 h2 数据库的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL模式下的h2数据库不接受PostgreSQL SQL语法

Mysql兼容的内存数据库中的查询错误(h2)

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

Mysql兼容的内存数据库中的查询错误(h2)

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

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