Cú pháp MySQL để tham gia cập nhật


83

Tôi có hai bảng trông như thế này

Xe lửa

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

Đặt trước

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

Hiện tại, tôi đang cố gắng tạo một truy vấn sẽ tăng sức chứa trên Tàu nếu việc đặt chỗ bị hủy. Tôi biết mình phải thực hiện Tham gia, nhưng tôi không chắc cách thực hiện trong câu lệnh Cập nhật. Ví dụ: tôi biết cách nhận sức chứa của một chuyến tàu với một ReservationID nhất định, như sau:

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

Nhưng tôi muốn tạo truy vấn thực hiện điều này -

Increment Train.Capacity by ReservationTable.NoSeats given a ReservationID

Nếu có thể, tôi cũng muốn biết cách Tăng số lượng ghế tùy ý. Ngoài ra, tôi đang lên kế hoạch xóa phần đặt trước sau khi thực hiện bước tăng trong một giao dịch Java. Việc xóa có ảnh hưởng đến giao dịch không?

Cảm ơn đã giúp đỡ!


2
Tôi biết đây là một bài đăng đã 9 năm tuổi, nhưng đối với một số thứ như năng lực tàu hỏa, bạn không muốn cập nhật một chuyên mục cho điều này trừ khi bạn có lý do thực sự chính đáng. Như bạn đã chỉ ra, đó là một tham gia duy nhất. Đây là thứ sẽ cập nhật RẤT NHIỀU - cho mỗi lần đặt chỗ, vì vậy, điều này nên được thực hiện nhanh chóng khi chọn truy vấn với tham gia, thay vì cập nhật. Cập nhật quá mức sẽ khóa bảng.
Jonathan

Câu trả lời:


163

MySQL hỗ trợ cú pháp nhiều bảngUPDATE , trông giống như sau:

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

Bạn có thể cập nhật Trainbảng và xóa khỏiReservations bảng trong cùng một giao dịch. Miễn là bạn thực hiện cập nhật đầu tiên và sau đó thực hiện xóa lần thứ hai, nó sẽ hoạt động.


3
Bah, tôi đặt SETtrước JOINdo nhầm lẫn. NB folks
deed02392 30/09/13

5

Đây là một ví dụ khác về câu lệnh UPDATE có chứa các phép nối để xác định giá trị đang được cập nhật. Trong trường hợp này, tôi muốn cập nhật transaction.payee_id với id thanh toán của tài khoản liên quan, nếu payee_id bằng 0 (không được chỉ định).

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

Nếu bạn có thể tự hỏi tầm quan trọng của tài khoản JOIN thứ 2 (bí danh là ap), đó chỉ là vì lần đầu tiên tôi viết truy vấn dưới dạng SELECT (luôn luôn là thông lệ tốt) trước khi chuyển đổi thành câu lệnh UPDATE.
user3232196 19/07/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.