【问题标题】:JdbcSQLException executing PostgreSQL query with 'MATCH simple' in H2JdbcSQLException 在 H2 中使用“简单匹配”执行 PostgreSQL 查询
【发布时间】:2015-11-25 14:10:57
【问题描述】:

我正在尝试在开发模式(使用 H2)下运行当前在生产中使用 PostgreSQL 数据库的设置,但出现错误。如果我可以重用生产 SQL 而无需对其进行任何更改,那将是最好的。

使用此设置:

# H2 Database
spring.datasource.datasource-class-name=org.h2.jdbcx.JdbcDataSource
spring.datasource.url=jdbc:h2:mem:userregistry;DB_CLOSE_DELAY=-1;MODE=PostgreSQL

这个查询:

CREATE TABLE IF NOT EXISTS users.user_userrole (
    user_signum VARCHAR(20) NOT NULL,
    role VARCHAR(255) NOT NULL,
    CONSTRAINT user_userrole_pk PRIMARY KEY (user_signum, role),
    CONSTRAINT user_fk FOREIGN KEY (user_signum) REFERENCES users.user (signum) MATCH SIMPLE,
    CONSTRAINT role_fk FOREIGN KEY (role) REFERENCES users.userrole   
  (role_name) MATCH SIMPLE
);

引发此异常:

org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "<<SQL OMITTED FOR BREVITY>>"; 
expected "INDEX, ON, NOT, DEFERRABLE, NOCHECK, CHECK, ,, )";  [42001-185]

请注意,我已经在使用Mode=PostgreSQL。有什么想法吗?

谢谢

【问题讨论】:

  • 另一个很好的例子说明为什么在生产和测试中使用不同的 DBMS 是个坏主意。无需更改即可“重用”生产 SQL 的唯一方法是在本地安装 Postgres。
  • 在产品和测试中使用 2 个不同的数据库有什么意义。它不允许您探索数据库的问题,您可以在测试中找到这些问题,并修复要在生产中使用的代码。如果您只是更改数据库,那么您不仅是在浪费精力来解决问题以使用测试数据库,而且还会在事后完全更改数据库,因为您的努力在那时是无用的。
  • 拥有一个开发内存数据库和一个“常规”产品数据库是一种扩展实践。特别是如果您以后使用诸如 JPA 之类的技术(例如在本例中,这是一个非常简单的 CRUD 业务逻辑)将您的代码与 DBMS 隔离开来。只要您不编写本机 SQL(这是遗留的,我无法更改),这是可以的。这就是问题所在。
  • 你确定这是你在这个问题中引用的查询吗?因为根据错误消息,您的一个查询中有字符串文字“>”。尝试将 > 替换为 /* SQL OMMITTED FOR BREVITY */
  • 是的,我写这个字面是为了不让这个问题读得太长:-)

标签: spring postgresql h2


【解决方案1】:

H2 数据库不支持MATCH SIMPLE(与 Oracle、MS SQL Server、Apache Derby 相同)。

【讨论】:

  • 您好 Thomas,感谢您的回答。你是对的'MATCH SIMPLE'不被支持。我想知道是否有任何文档描述了 H2 处理 PostgreSQL 功能的局限性?
  • 很抱歉没有这样的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2021-10-21
  • 2022-06-15
  • 2016-06-04
  • 1970-01-01
相关资源
最近更新 更多