连接更新的MySQL语法


83

我有两个看起来像这样的桌子

培养

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

目前,我正在尝试创建一个查询,如果取消预订,该查询将增加火车的容量。我知道我必须执行Join,但是我不确定如何在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年历史的帖子,但是对于火车容量之类的东西,除非您有充分的理由,否则您不想为此更新专栏。正如您所指出的,这是一个单一的联接。这将每次预订更新很多,因此应使用连接动态选择查询,而不是更新。过多的更新锁定表。
乔纳森

Answers:


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为零(未分配),我想使用相关的帐户付款ID更新transaction.payee_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 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.