Вставьте или обновите таблицу, используя JDBC - PullRequest
1 голос
/ 07 декабря 2010

У меня есть несколько записей для импорта.Это нормально в первый раз, когда они вставляются.Если я пытаюсь импортировать те же данные снова, я получаю org.postgresql.util.PSQLException: ОШИБКА: двойное значение ключа нарушает ограничение уникальности.Как я могу обновить записи в базе данных, если данные такие же или изменились, и вставить, если это новые данные, используя JDBC?

public void store(Object entity) throws Exception {
    try {
        if (this.updateEntity((XEntity) entity) == 0) {
            this.insertEntity((XEntity) entity);
        }

        ...

    } catch (SQLException sqlEx) {
        ...
    }
}

private int updateEntity(XEntity entity) throws SQLException {
    PreparedStatement prepStmt = this.getUpdatePreparedStmt();
    ...
    return prepStmt.executeUpdate();
}

private void insertEntity(XEntity entity) throws SQLException {
    ...
    this.getInsertPreparedStmt().executeUpdate();
}

Проблема исправлена.Я дал ответ ниже.

Ответы [ 4 ]

1 голос
/ 07 декабря 2010

Вы можете попробовать использовать postgres SQL 'MERGE' или 'REPLACE'

0 голосов
/ 07 декабря 2010

Эта тестовая логика работает.

if (this.updateEntity((XEntity) entity) == 0) {
    this.insertEntity((XEntity) entity);
}

Проблема была в методе, который обновил запись.В предложении WHERE в операторе, подготовленном для обновления, использовались разные данные (данные, содержащие пробелы), поэтому updateEntity всегда возвращал 0. Это было причиной того, что вместо обновлений делались только вставки.Большое спасибо за вашу помощь.

0 голосов
/ 07 декабря 2010

Если вы хотите использовать один и тот же метод для вставки и обновления ваших данных, вам необходимо проверить, существуют ли данные в первую очередь. Команда SQL, используемая для вставки нового объекта, - INSERT, а команда, используемая для обновления элемента - UPDATE. Итак, что вы можете сделать, это сделать SELECT, чтобы проверить, уже есть ли ваши данные, а затем сделать INSERT или UPDATE на основе результатов.

Однако это обходной путь. Вам действительно нужно уточнить свою реализацию и использовать разные методы, независимо от того, добавляете ли вы или обновляете данные. С точки зрения бизнеса, это две совершенно разные функции, поэтому один метод для обоих кажется мне проблемой проектирования.

0 голосов
/ 07 декабря 2010

Вы можете передать команду UPDATE в виде строки через JDBC.

Согласно этой ТАКОЙ записи, вам придется написать 2 заявления.

...