Как правильно обновить запись, если она существует, или добавить, если ее нет (UPSERT)? - PullRequest
0 голосов
/ 12 апреля 2019

Существует коллекция с множеством предметов.Коллекция отображается в виде таблицы.Пользователь в автономном режиме может добавлять и удалять записи, а также обновлять ранее полученные с помощью SELECT * FROM ...

Я хочу реализовать функцию «Сохранить все», при которой программа будет проходить через всеколлекции и обновлять записи в базе данных, если они существуют, и добавлять новые, если они не существуют.

Пришел к следующему решению (сторона Java):

@Override
public void updateAll(List<User> users)
{
    //online
    Connection connection = null;
    PreparedStatement statement = null;

    try
    {
        connection = Database.getInstance().getConnection();
        connection.setAutoCommit(false);

        for (User user : users)
        {
            statement = connection.prepareStatement("");  //THIS IS WHERE A CORRECT QUERY SHOULD BE CREATED
            statement.execute();
        }

        connection.commit();
    }
    catch (SQLException ex)
    {
        Log.error("Unable to updateAll users. " + ex.getMessage());
    }
    finally
    {
        Database.closeQuietly(statement);
        Database.closeQuietly(connection);
    }
}

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

Теперь о самом запросе ... I обнаружил , что PostgreSQL поддерживает необходимую мне функциональность:

INSERT INTO the_table (id, column_1, column_2) 
VALUES (1, 'A', 'X'), (2, 'B', 'Y'), (3, 'C', 'Z')
ON CONFLICT (id) DO UPDATE 
  SET column_1 = excluded.column_1, 
      column_2 = excluded.column_2;

Сразу возникло несколько вопросов:

  • Теперь мне нужно поместить это в PreparedStatement.Я знаю, как безопасно вставить данные в часть запроса INSERT, но как насчет части UPDATE, где вам нужно перечислить все данные в скобках - кроме объединения строк, ничего не пришло в голову, но, насколько я знаю,это не путь джедая.
  • Поскольку мне нужно обновлять данные чаще, чем вставлять новые, правильно ли использовать часть INSERT в качестве основы и только затем выполнять UPDATE, если она существует?Может быть, мне не стоит беспокоиться, а может, это действительно повлияет на скорость?Своп?Но как?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...