Если существует, накапливайте, в противном случае вставьте в Hibernate - PullRequest
0 голосов
/ 21 апреля 2020

В качестве примера, скажем, я хочу сохранить строки кода, которые я написал для указанных c дней разных месяцев, в базе данных MySQL, используя Hibernate. 5 января я пишу 100 строк кода. Я не писал ранее ни одной строки кода в этот день, поэтому он просто вставляет данные.

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

DAY.      MONTH.      LOC.
5.        1.          150.

В настоящее время я делаю то, что каждый раз, когда я хочу вставить новые данные Я сначала делаю запрос SELECT, чтобы проверить, существует ли уже строка. Если это так, я создаю оператор UPDATE, в противном случае я просто создаю оператор INSERT. Я работаю с большим количеством данных и заметил, что операции с моей базой данных начинают занимать много времени. Поэтому мне было интересно, есть ли лучший, более эффективный способ сделать это? Помощь очень ценится. Спасибо.

1 Ответ

0 голосов
/ 21 апреля 2020

Вы, похоже, ищете синтаксис update... on duplicate key. Это будет выглядеть так:

insert into mytable(day, month, loc)
values(:day, :month, :loc)
on duplicate key update loc = loc + values(loc)

:day, :month и :loc представляют параметры, которые вы задаете для insert.

Чтобы это работало, вам нужен ограничение уникальности для (day, month) (или сделать этот кортеж столбцов первичным ключом вашей таблицы).

Когда возникает insert, который нарушает ограничение уникальности, MySQL переходит к предложению on duplicate key где мы добавляем новое значение loc к значению, уже существующему в существующей строке.

...