Каким образом можно выполнить операцию INSERT в две таблицы одновременно, используя один запрос?

Как правильно объединить две (или три) команды в одном обращении к MySQL с использованием jdbcTemplate? Пытаюсь выполнить INSERT с добавлением двух записей в одной таблице и одной записи в другой таблице.
Пробовал использовать START TRANSACTION, BEGIN и COMMIT, но безуспешно. Код, который я пробовал использовать, выглядит следующим образом:

```jdbcTemplate.update("INSERT INTO statusChat VALUES("+id1+", "invited), ("+id2+", invite); INSERT INTO invites VALUES(?,?,?,?);",id2,id1,name,pageUrl);```

Насколько я понимаю, это не работает. Можете подсказать, как правильно совместить эти команды?
  • 17 ноября 2023 г. 15:01
Ответы на вопрос 2
Вы можете выполнить операцию INSERT в две таблицы одновременно, используя один запрос, с помощью конструкции `INSERT INTO ... SELECT ... UNION SELECT ...`:

```sql
INSERT INTO table1 (column1, column2, ...)
SELECT value1, value2, ...
UNION
SELECT value1, value2, ...
```

Вместо `value1`, `value2` и т.д. вы должны указать значения, которые вы хотите вставить в таблицы.

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

```sql
INSERT INTO statusChat (id, status)
VALUES (id1, 'invited'), (id2, 'invite');

INSERT INTO invites (column1, column2, column3, column4)
VALUES (?, ?, ?, ?);
```

Вместо `column1`, `column2`, и т.д. вы должны указать столбцы таблицы `invites`, а затем передать соответствующие значения в метод `jdbcTemplate.update()`.

Чтобы объединить две команды INSERT в одном обращении к MySQL с использованием `jdbcTemplate`, вы можете использовать метод `update(String sql)` и передать запрос, содержащий оба оператора INSERT, разделенные точкой с запятой:

```java
String sql = "INSERT INTO statusChat (id, status) VALUES (" + id1 + ", 'invited'), (" + id2 + ", 'invite'); " +
             "INSERT INTO invites (column1, column2, column3, column4) VALUES (?, ?, ?, ?);";
jdbcTemplate.update(sql, value1, value2, value3, value4);
```

Замените `value1`, `value2` и т.д. на соответствующие значения, которые вы хотите вставить в таблицу `invites`.
Транзакция может быть открыта для совершения двух отдельных вставок в различные таблицы. Это имеет смысл, с точки зрения базы данных, как атомарное действие. Что именно ты хотел?
Похожие вопросы