MySQL-Syntax für Join Update

83

Ich habe zwei Tabellen, die so aussehen

Zug

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

Reservierungen

+---------------+-------------+------+-----+---------+----------------+
| 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    |                |
+---------------+-------------+------+-----+---------+----------------+

Derzeit versuche ich, eine Abfrage zu erstellen, die die Kapazität eines Zuges erhöht, wenn eine Reservierung storniert wird. Ich weiß, dass ich einen Join durchführen muss, bin mir aber nicht sicher, wie ich das in einer Update-Anweisung tun soll. Zum Beispiel weiß ich, wie man die Kapazität eines Zuges mit einer bestimmten Reservierungs-ID erhält, wie folgt:

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

Aber ich möchte die Abfrage erstellen, die dies tut -

Increment Train.Capacity by ReservationTable.NoSeats given a ReservationID

Wenn möglich, möchte ich auch wissen, wie man um eine beliebige Anzahl von Sitzen erhöht. Nebenbei habe ich vor, die Reservierung zu löschen, nachdem ich das Inkrement in einer Java-Transaktion ausgeführt habe. Wird das Löschen die Transaktion beeinflussen?

Danke für die Hilfe!

Larjudge
quelle
2
Ich weiß, dass dies ein 9 Jahre alter Beitrag ist, aber für so etwas wie Zugkapazität möchten Sie keine Spalte dafür aktualisieren, es sei denn, Sie haben einen wirklich guten Grund. Wie Sie bereits betont haben, handelt es sich um eine einzelne Verknüpfung. Dies ist etwas, das VIEL aktualisiert - pro Reservierung, daher sollte dies eine spontane Auswahlabfrage mit Join sein, anstatt sie zu aktualisieren. Übermäßige Aktualisierungen sperren Tabellen.
Jonathan

Antworten:

163

MySQL unterstützt eine Multi-Table- UPDATESyntax , die ungefähr so ​​aussehen würde:

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

Sie können Traindie ReservationsTabelle in derselben Transaktion aktualisieren und aus der Tabelle löschen . Solange Sie zuerst das Update und dann das Löschen durchführen, sollte es funktionieren.

Bill Karwin
quelle
3
Bah, ich habe das versehentlich SETvor das JOINgestellt. NB Leute
deed02392
5

Hier ist ein weiteres Beispiel für eine UPDATE-Anweisung, die Verknüpfungen enthält, um den Wert zu ermitteln, der aktualisiert wird. In diesem Fall möchte ich die transaction.payee_id mit der entsprechenden Konto-Zahlungs-ID aktualisieren, wenn die payee_id Null ist (wurde nicht zugewiesen).

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
user3232196
quelle
Wenn Sie sich fragen, welche Bedeutung der 2. JOIN für die Berücksichtigung hat (Alias ​​als ap), lag dies nur daran, dass ich die Abfrage vor der Konvertierung in die UPDATE-Anweisung zuerst als SELECT (was immer eine gute Praxis ist) geschrieben habe.
user3232196