조인 업데이트를위한 MySQL 구문


84

이렇게 생긴 테이블이 두 개 있어요

기차

+----------+-------------+------+-----+---------+-------+
| 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 문에서 수행하는 방법을 잘 모르겠습니다. 예를 들어 특정 ReservationID를 사용하여 열차의 용량을 얻는 방법을 알고 있습니다.

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 년 된 포스트라는 것을 알고 있지만, 열차 수용 능력과 같은 것에 대해서는 정말 좋은 이유가 없다면 이것에 대한 열을 업데이트하고 싶지 않습니다. 지적했듯이 단일 조인입니다. 이것은 예약 당 많은 것을 업데이트 할 것이므로 업데이트가 아닌 조인을 사용하여 즉시 선택 쿼리를 수행해야합니다. 과도한 업데이트 잠금 테이블.
Jonathan

답변:


166

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
Bah, 실수로 SET앞에 넣었습니다 JOIN. NB 여러분
deed02392 2013 년

5

다음은 업데이트되는 값을 확인하기위한 조인을 포함하는 UPDATE 문의 또 다른 예입니다. 이 경우 payee_id가 0 (할당되지 않은 경우) 인 경우 transaction.payee_id를 관련 계정 결제 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

계정에 대한 두 번째 JOIN (ap으로 별칭)의 중요성이 궁금하다면 UPDATE 문으로 변환하기 전에 쿼리를 SELECT (항상 좋은 방법)로 처음 작성했기 때문입니다.
user3232196
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.