2010-01-22 35 views
57

Mam dwie tabele, które wyglądają jak toskładnia MySQL dla Dołącz Aktualizacja

Pociąg

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

Rezerwacje

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

Obecnie próbuję utworzyć kwerendę, która będzie zwiększamy pojemność pociągu, jeżeli rezerwacja zostanie anulowana. Wiem, że muszę wykonać Join, ale nie jestem pewien, jak to zrobić w oświadczeniu Update. Dla przykładu, wiem jak dostać zdolności pociągu ze względu pewien identyfikator rezerwacji, tak jak poniżej:

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

Ale chciałbym skonstruować kwerendę, która to robi -

Increment Train.Capacity by ReservationTable.NoSeats given a ReservationID 

If możliwe, chciałbym też wiedzieć, jak zwiększać o dowolną liczbę miejsc. Na marginesie planuję usunięcie rezerwacji po wykonaniu przyrostu w transakcji Java. Czy usunięcie wpłynie na transakcję?

Dzięki za pomoc!

Odpowiedz

118

MySQL podtrzymuje multi-table UPDATE syntax, który będzie wyglądał mniej więcej tak:

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

można zaktualizować tabelę Train i usuwać ze stołu Reservations w tej samej transakcji. Tak długo, jak robisz aktualizację w pierwszej kolejności, a następnie usuniesz drugi, powinna działać.

+3

Bah, przez pomyłkę wstawiłem 'SET' przed" JOIN ". NB ludzie – deed02392