結合更新のMySQL構文


83

このようなテーブルが2つあります

列車

+----------+-------------+------+-----+---------+-------+
| 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年前の投稿ですが、電車の定員などの理由で、本当に正当な理由がない限り、この列を更新することは望ましくありません。ご指摘のとおり、これは単一の結合です。これは、予約ごとにA LOTを更新するものであるため、更新ではなく、結合を使用してオンザフライでselectクエリを実行する必要があります。過度の更新はテーブルをロックします。
ジョナサン

回答:


163

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
ああ、私は間違ってSET前に置いたJOIN。NBの人々
deed02392 2013

5

これは、更新される値を決定するための結合を含むUPDATEステートメントの別の例です。この場合、payee_idがゼロ(割り当てられていない)の場合、transactions.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

2番目のJOINの説明(apと呼ばれる)の重要性について疑問に思われるかもしれませんが、それは、UPDATEステートメントに変換する前に最初にクエリをSELECTとして記述したためです(これは常に良い習慣です)。
user32321 9619
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.