2008-09-02 14 views
7

मेरे पास एक SQL क्वेरी है जो निम्न प्रपत्र लेती है:मैं एक एकल SQL क्वेरी में एकाधिक अपडेट कैसे करूं?

UPDATE foo 
SET flag=true 
WHERE id=? 

मेरे पास एक PHP सरणी भी है जिसमें आईडी की एक सूची है। निम्नानुसार पार्सिंग के अलावा इसे पूरा करने का सबसे अच्छा तरीका क्या है ...

foreach($list as $item){ 
    $querycondition = $querycondition . " OR " . $item; 
} 

... और WHERE खंड में आउटपुट का उपयोग करना?

उत्तर

9

यह भी वही करता है जाएगा, लेकिन शायद एक गति वृद्धि की ज्यादा उपज नहीं है, लेकिन अच्छे लग रहा है।

mysql_query("UPDATE foo SET flag=true WHERE id IN (".implode(', ',$list).")"); 
5

आप में खंड का उपयोग करने में सक्षम होना चाहिए (अपने डेटाबेस संभालने इसका समर्थन करता है):

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

0

मैंने कभी है कि आपके foreach पाश के अलावा अन्य करने के लिए एक तरह से नहीं देखा है।

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

1

उपयोग के साथ समाप्त करने के लिए अल्प विराम द्वारा सीमांकित सूची बनाने के लिए/फटना में शामिल होने:

UPDATE foo SET flag=true WHERE id IN (1,2,3,4) 
0

आप जेम आप केस स्टेटमेंट के साथ अपडेट कर सकते हैं लेकिन आपको स्वयं को क्वेरी बनाना होगा।

UPDATE foo 
SET flag=CASE ID WHEN 5 THEN true ELSE flag END 
    ,flag=CASE ID WHEN 6 THEN false ELSE flag END 
WHERE id in (5,6) 

जहां छोड़ा जा सकता है लेकिन आपको एक पूर्ण तालिका अद्यतन से बचाता है।

0

VB.NET कोड: स्ट्रिंग के रूप में मंद delimitedIdList = arrayToString (listOfIds)

स्ट्रिंग के रूप में मंद एसक्यूएल = "(+ delimitedIdList +") "अद्यतन foo सेट ध्वज = सच कहां में आईडी"

runSql (एसक्यूएल)

5

इन कथन का उपयोग करें। प्रमुख मूल्यों की अल्पविराम से अलग सूची प्रदान करें। आप implode फ़ंक्शन का उपयोग करके आसानी से ऐसा कर सकते हैं।

UPDATE foo SET flag = true WHERE flag = false 

या सबक्वेरी:

UPDATE foo SET flag = true WHERE id IN (1, 2, 3, 4, 5, ...) 

वैकल्पिक रूप से आप शर्त का उपयोग कर सकते

UPDATE foo SET flag = true WHERE id IN (SELECT id FROM foo WHERE .....) 
0

क्या आप जानते हैं एक आइटम फिर "में 'खंड का उपयोग के नंबर पर ही, दूसरों के रूप में तो सुझाव दिया है:

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6) 

हालांकि एक चेतावनी यह है कि आपके डीबी के आधार पर खंड में तत्वों की संख्या की सीमा हो सकती है। जैसे ओरेकल 7 या 8 (?) 256 आइटमों की सीमा थी (यह बाद के संस्करणों में उल्लेखनीय रूप से बढ़ी थी)
यदि आप किसी सूची में पुनरावृत्ति करते हैं तो एक लेनदेन का उपयोग करें ताकि यदि अपडेट में से कोई एक

विफल हो जाता है तो आप रोलबैक कर सकते हैं
संबंधित मुद्दे