2010-01-22 19 views
57

ich zwei Tabellen, die diese aussehenMySQL-Syntax für Update-Join

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 Ich versuche, eine Abfrage zu erstellen, die erhöht wird Kapazität in einem Zug, wenn eine Reservierung storniert wird. Ich weiß, dass ich einen Join ausführen muss, aber ich bin nicht sicher, wie es in einer Update-Anweisung zu tun ist. Zum Beispiel weiß ich, wie die Kapazität eines Zugs bekommen mit einer gewissen einer Reservierungs gegeben, etwa so:

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

Aber ich mag die Abfrage konstruieren, das 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 inkrementieren kann. Nebenbei möchte ich die Reservierung löschen, nachdem ich das Inkrement in einer Java-Transaktion ausgeführt habe. Wirkt sich das Löschen auf die Transaktion aus?

Danke für die Hilfe!

Antwort

118

MySQL unterstützt eine multi-table UPDATE syntax, die wie folgt in etwa aussehen:

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

Sie können aktualisieren Sie die Train Tabelle und löschen von der Reservations Tabelle in der gleichen Transaktion. Solange Sie zuerst das Update durchführen und dann das Löschen als zweites ausführen, sollte es funktionieren.

+3

Bah, ich habe versehentlich die 'SET' vor die' JOIN' gesetzt. NB Leute – deed02392

Verwandte Themen