【问题标题】:Jooq - Ignore DuplicatesJooq - 忽略重复
【发布时间】:2012-05-02 03:39:58
【问题描述】:

我目前正在将 Jooq 用于一个项目,但我需要一种方法来忽略插入时的重复键。

我有一个要写入表的对象数组,但如果它们已经存在,由 START_TS 和 EVENT_TYPE 上的复合唯一索引确定,我希望插入以静默方式失败。

我的代码如下所示:

InsertValuesStep<MyRecord> query = fac.insertInto(MY_REC,
                MY_REC.START_TS,
                MY_REC.STOP_TS,
                MY_REC.EVENT_DATA,
                MY_REC.EVENT_TYPE,
                MY_REC.PUBLISHED_TS,
                MY_REC.MY_ID
                );

        for(int i=0;i<recs.length;i++)
        {
            MyClass evt = recs[i]; 
            query.values(
                    new java.sql.Date(evt.startTS.getTime()),
                    (evt.stopTS == null) ? null : new java.sql.Date(evt.stopTS.getTime()),
                    evt.eventData,
                    evt.type.name(),
                    date,
                    id)

        }

        query.execute();

这样的解决方案将是理想的:https://stackoverflow.com/a/4920619/416338

我想我需要添加如下内容:

.onDuplicateKeyUpdate().set(MY_REC.EVENT_TYPE,MY_REC.EVENT_TYPE);

但无论我添加什么,它似乎仍然会在重复项上引发错误。

【问题讨论】:

  • 我不知道这个工具,但是在简单的 SQL 中,你可以执行类似 INSERT INTO table (SELECT col1, col2 FROM (VALUES(val1, val2)) as temp(col1, col2) WHERE NOT EXISTS (SELECT '1' FROM table where col1 = val1)) 的操作,它的优点是几乎适用于所有 RDBMS(或稍有变化)。
  • @LukasEder INSERT INTO t (column1, ... columnN) SELECT ... FROM some other tables ... 几乎所有(如果不是全部)DBMS 都支持。
  • @ypercube:我一定错过了SELECT...我的错

标签: java sql database jooq


【解决方案1】:

支持 MySQL 的 INSERT IGNORE INTO 语法在 jOOQ 2.3.0 的路线图上。最近在jOOQ user group 上对此进行了讨论。此语法将在所有其他支持 SQL MERGE 语句的 SQL 方言中模拟。

同时,作为一种解决方法,您可以尝试一次插入一条记录

【讨论】:

    猜你喜欢
    • 2020-05-03
    • 2017-09-08
    • 2020-09-10
    • 2021-05-18
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2011-01-22
    相关资源
    最近更新 更多