【问题标题】:H2 Java Insert ignore - allow exceptionH2 Java 插入忽略 - 允许异常
【发布时间】:2025-12-30 11:00:11
【问题描述】:

我正在开发一个与 H2 数据库接口的 java 插件。我真正想要的是“插入忽略”语句;但是,我知道 H2 不支持这一点。我也知道 Merge,但这真的不是我想要的,如果记录存在我不想更改它。

我正在考虑的只是运行插入并让重复键异常发生。但是,我不希望它填满我的日志文件。 DB 调用发生在我无法更改的导入类中。所以我的问题是:

  1. 这是合理的做法吗?我不是让错误发生的人,但这似乎是这种情况下最好的方法(它不应该发生那么多)。
  2. 如何防止此异常影响我的日志文件?如果没有办法阻止堆栈中的异常,我可以重定向作为输出的堆栈跟踪的输出吗?

谢谢。

【问题讨论】:

    标签: java exception h2


    【解决方案1】:

    一种解决方案是使用:

    insert into test 
    select 1, 'Hello' from dual 
    where not exists(select * from test where id = 1)
    

    这应该适用于所有数据库(双部分除外;您可能需要创建自己的单行虚拟表)。

    要禁用日志记录异常,请将;trace_level_file=0 附加到数据库 URL:

    jdbc:h2:~/test;trace_level_file=0
    

    或运行 SQL 语句:

    set trace_level_file 0
    

    【讨论】:

    • 不错的解决方法 - 在等待时已经用 2 个单独的查询做了类似的事情。不过,我仍然想了解 Java 异常。
    • 我不会费心测试这个,但我不确定它是否会起作用(无论如何都给了你分数)。我指的异常是在应用程序中记录的,而不是直接从 h2 中记录的。
    • 我会发布我的代码/日志,但这不是我要发布的代码。谢谢。
    • "对偶部分除外;您可能需要创建自己的单行虚拟表"。这听起来很 hacky。