Синтаксис MySQL для оновлення приєднання


83

У мене є дві таблиці, які виглядають так

Поїзд

+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| TrainID  | varchar(11) | NO   | PRI | NULL    |       |
| Capacity | int(11)     | NO   |     | 50      |       |
+----------+-------------+------+-----+---------+-------+

Бронювання

+---------------+-------------+------+-----+---------+----------------+
| Field         | Type        | Null | Key | Default | Extra          |
+---------------+-------------+------+-----+---------+----------------+
| ReservationID | int(11)     | NO   | PRI | NULL    | auto_increment |
| FirstName     | varchar(30) | NO   |     | NULL    |                |
| LastName      | varchar(30) | NO   |     | NULL    |                |
| DDate         | date        | NO   |     | NULL    |                |
| NoSeats       | int(2)      | NO   |     | NULL    |                |
| Route         | varchar(11) | NO   |     | NULL    |                |
| Train         | varchar(11) | NO   |     | NULL    |                |
+---------------+-------------+------+-----+---------+----------------+

В даний час я намагаюся створити запит, який збільшить пропускну здатність поїзда, якщо бронювання скасовано. Я знаю, що мені потрібно виконати Приєднання, але я не впевнений, як це зробити в заяві Update. Наприклад, я знаю, як отримати пропускну здатність поїзда з певним ідентифікатором Reservation, наприклад так:

select Capacity 
  from Train 
  Join Reservations on Train.TrainID = Reservations.Train 
 where ReservationID = "15";

Але я хотів би створити запит, який робить це -

Increment Train.Capacity by ReservationTable.NoSeats given a ReservationID

Якщо можливо, я хотів би знати також, як збільшити довільну кількість місць. Окрім того, я планую видалити резервування після того, як я виконаю збільшення в транзакції Java. Чи вплине видалення на транзакцію?

Дякую за допомогу!


2
Я знаю, що це 9-річна посада, але для чогось типу пропускної здатності поїзда ви не хочете оновлювати колонку для цього, якщо у вас немає дійсно вагомих причин. Як ви зазначили, це єдине приєднання. Це те, що буде оновлювати БАГАТО - за бронювання, тому це має бути на льоту вибір запиту з join, а не оновлення. Надмірне оновлення блокує таблиці.
Джонатан,

Відповіді:


163

MySQL підтримує багатотабличний UPDATEсинтаксис , який виглядатиме приблизно так:

UPDATE Reservations r JOIN Train t ON (r.Train = t.TrainID)
SET t.Capacity = t.Capacity + r.NoSeats
WHERE r.ReservationID = ?;

Ви можете оновити Trainтаблицю та видалити з Reservationsтаблиці в одній транзакції. Поки ви виконуєте оновлення спочатку, а потім видаляєте друге, воно повинно працювати.


3
Бах, я поставив SETперед JOINпомилкою. Люди NB
deed02392

5

Ось ще один приклад оператора UPDATE, який містить об’єднання для визначення значення, яке оновлюється. У цьому випадку я хочу оновити транзакцію.payee_id з відповідним ідентифікатором платежу за рахунком, якщо ідентифікатор одержувача дорівнює нулю (не призначено).

UPDATE transactions t
  JOIN account a ON a.id = t.account_id
  JOIN account ap ON ap.id = a.pmt_act_id
  SET  t.payee_id = a.pmt_act_id
 WHERE t.payee_id = 0

Якщо вам може бути цікаво, яке значення має друге ПРИЄДНАННЯ до облікового запису (псевдонім як ap), це було лише тому, що я вперше написав запит як SELECT (що завжди є гарною практикою) перед перетворенням на оператор UPDATE.
user3232196
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.