조인 업데이트를위한 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.