كيف أفعل تحديثات متعددة في واحد استعلام SQL?

StackOverflow https://stackoverflow.com/questions/39792

  •  09-06-2019
  •  | 
  •  

سؤال

لدي استعلام SQL الذي يأخذ الشكل التالي:

UPDATE foo
SET flag=true
WHERE id=?

لدي أيضا مجموعة PHP التي لديه قائمة من معرفات.ما هي أفضل طريقة لتحقيق هذا الهدف من التحليل على النحو التالي ...

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

...واستخدام الناتج في WHERE الحدوث ؟

هل كانت مفيدة؟

المحلول

وهذا من شأنه تحقيق نفس الشيء, ولكن ربما لن تسفر عن الكثير من زيادة السرعة, ولكن يبدو أجمل.

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

نصائح أخرى

يجب أن تكون قادرا على استخدام في البند (على افتراض قاعدة البيانات الخاصة بك يدعم ذلك):

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

استخدام في البيان.توفر مفصولة بفواصل قائمة من القيم الأساسية.يمكنك بسهولة القيام بذلك باستخدام implode وظيفة.

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

بدلا من ذلك يمكنك استخدام الشرط:

UPDATE foo SET flag = true WHERE flag = false

أو فرعي:

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

استخدام الانضمام/تنهار لجعل قائمة بفواصل في نهاية المطاف مع:

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

لم رأيت من أي وقت مضى وسيلة للقيام بذلك الأخرى من حلقة foreach.

ولكن إذا $القائمة في أي بالطريقة التي حصلت من المستخدم ، يجب أن يلتزم باستخدام إعداد البيان فقط تحديث صف واحد في وقت واحد (على افتراض شخص لا يملك وسيلة لتحديث العديد من الصفوف مع بيان معد سلفا).وإلا مفتوحة حقن sql.

يمكنك المربى لكم تحديث مع حالة البيانات ولكن سيكون لديك لبناء الاستعلام الخاص بك.

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)  

حيث يمكن حذفها ولكن يوفر لك من الجدول الكامل التحديث.

VB.NET كود: خافت delimitedIdList as string = arrayToString(listOfIds)

dim SQL as string = " تحديث فو تعيين العلم=true حيث الهوية في (" + delimitedIdList + ")"

runSql(SQL)

إذا كنت تعرف ملزمة على عدد من العناصر ثم استخدام "في" شرط ، كما اقترح آخرون:

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

تحذير واحد على الرغم من أنه اعتمادا على ديسيبل قد يكون هناك عدد محدد من العناصر في الشرط.على سبيل المثال oracle 7 أو 8 (?) تستخدم إلى حد من 256 البنود (كان هذا زيادة كبيرة في الإصدارات الأحدث)
إذا كنت تفعل تكرار عبر قائمة استخدام المعاملات حتى تتمكن من التراجع إذا كان أحد التحديثات فشل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top