जॉइन अपडेट के लिए 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    |                |
+---------------+-------------+------+-----+---------+----------------+

वर्तमान में, मैं एक क्वेरी बनाने की कोशिश कर रहा हूं जो आरक्षण रद्द होने पर ट्रेन में क्षमता बढ़ाएगा। मुझे पता है कि मुझे ज्वाइन करना है, लेकिन मुझे यकीन नहीं है कि इसे अपडेट स्टेटमेंट में कैसे किया जाए। उदाहरण के लिए, मुझे पता है कि एक निश्चित आरक्षण के साथ ट्रेन की क्षमता कैसे प्राप्त की जाए, जैसे:

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

लेकिन मैं क्वेरी का निर्माण करना चाहता हूं जो ऐसा करता है -

Increment Train.Capacity by ReservationTable.NoSeats given a ReservationID

यदि संभव हो तो, मैं यह भी जानना चाहूंगा कि सीटों की एक मनमानी संख्या से वृद्धि कैसे की जाए। एक तरफ के रूप में, मैं एक जावा लेनदेन में वेतन वृद्धि करने के बाद आरक्षण को हटाने की योजना बना रहा हूं। क्या डिलीट होने से लेन-देन पर असर पड़ेगा?

सहायता के लिए धन्यवाद!


2
मुझे पता है कि यह एक 9 साल पुरानी पोस्ट है, लेकिन ट्रेन की क्षमता जैसी किसी चीज के लिए, आप इसके लिए एक कॉलम अपडेट नहीं करना चाहते हैं जब तक कि आपके पास वास्तव में अच्छा कारण न हो। जैसा कि आपने बताया, यह एक सिंगल जॉइन है। यह एक ऐसी चीज है जो A LOT - प्रति आरक्षण अपडेट करेगी, इसलिए यह अपडेट के बजाय जॉइन के साथ फ्लाई सेलेक्ट क्वेरी पर होना चाहिए। अत्यधिक अद्यतन लॉक टेबल।
जोनाथन

जवाबों:


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
बाह, मैंने गलती SETसे पहले डाल दिया JOIN। नायब लोग
deed02392

5

यहां अद्यतन अद्यतन का मान निर्धारित करने के लिए जुड़ने वाले अद्यतन का एक और उदाहरण है। इस मामले में, मैं संबंधित खाता भुगतान आईडी के साथ लेन-देन अपडेट करना चाहता हूं। यदि भुगतानकर्ता शून्य है (असाइन नहीं किया गया था)।

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

अगर आप सोच रहे होंगे कि 2nd JOIN को अकाउंट (एप के रूप में उतारा) का क्या महत्व है, तो सिर्फ इसलिए कि मैंने पहली बार UPDATE स्टेटमेंट में कनवर्ट करने से पहले एक SELECT (जो हमेशा अच्छा अभ्यास है) के रूप में क्वेरी लिखी थी।
user3232196
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.