2010-01-22 7 views
57

Tengo dos tablas que se ven asísintaxis de MySQL para Unirse Actualizar

tren

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

Reservas

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

Actualmente, estoy intentando crear una consulta que se incrementará la capacidad en un tren si se cancela una reserva. Sé que tengo que realizar una unión, pero no estoy seguro de cómo hacerlo en una declaración de actualización. Por ejemplo, yo sé cómo llegar a la capacidad de un tren con dado un cierto ReservationId, así:

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

Pero me gustaría construir la consulta que hace esto -

Increment Train.Capacity by ReservationTable.NoSeats given a ReservationID 

Si posible, me gustaría saber también cómo Incrementar en una cantidad arbitraria de asientos. Por otro lado, estoy planeando eliminar la reserva luego de realizar el incremento en una transacción Java. ¿El efecto de eliminación afectará la transacción?

¡Gracias por la ayuda!

Respuesta

118

MySQL soporta un multi-table UPDATE syntax, que se vería aproximadamente así:

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

Puede actualizar la tabla Train y eliminar de la tabla Reservations en la misma transacción. Siempre que haga la actualización primero y luego haga la segunda eliminación, debería funcionar.

+3

Bah, puse el 'SET' antes de' JOIN' por error. NB amigos – deed02392

Cuestiones relacionadas