2012-04-20 3 views
2

В настоящее время я использую Jooq для проекта, но мне нужен способ игнорировать повторяющиеся ключи вставки.Jooq - Ignore Duplicates

У меня есть массив объектов, которые я хочу записать в таблицу, но если они уже существуют, определяемые составным уникальным индексом в 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); 

Но что бы я ни добавьте его, похоже, выдает ошибку для дубликатов.

+2

Я не знаю, этот инструмент, но в простом SQL вы можете сделать что-то вроде 'INSERT INTO таблицы (SELECT col1 , col2 FROM (VALUES (val1, val2)) как temp (col1, col2) ГДЕ НЕ СУЩЕСТВУЕТ (SELECT '1' FROM table, где col1 = val1)) ', который имеет силу для работы почти во всех РСУБД (или небольшой вариации). –

+0

@LukasEder 'INSERT INTO t (column1, ... columnN) SELECT ... FROM некоторых других таблиц ...' поддерживается почти всеми (если не все) СУБД. –

+0

@ypercube: Я, должно быть, пропустил 'SELECT' ... мой плохой –

ответ

2

Поддержка синтаксиса MySQL INSERT IGNORE INTO приведена в дорожной карте для jOOQ 2.3.0. Это обсуждалось недавно на форуме jOOQ user group. Этот синтаксис будет моделироваться во всех других диалектах SQL, поддерживающих инструкцию SQL MERGE.

В то же время, как решить эту проблему, можно попытаться вставить одну запись в то время