update - تحديثات متعددة في MySQL




update sql c# (12)

أعلم أنه يمكنك إدراج صفوف متعددة في وقت واحد ، هل هناك طريقة لتحديث صفوف متعددة في وقت واحد (كما في ، في استعلام واحد) في MySQL؟

تحرير: على سبيل المثال لدي ما يلي

Name   id  Col1  Col2
Row1   1    6     1
Row2   2    2     3
Row3   3    9     5
Row4   4    16    8

أرغب في دمج جميع التحديثات التالية في استعلام واحد

UPDATE table SET Col1 = 1 WHERE id = 1;
UPDATE table SET Col1 = 2 WHERE id = 2;
UPDATE table SET Col2 = 3 WHERE id = 3;
UPDATE table SET Col1 = 10 WHERE id = 4;
UPDATE table SET Col2 = 12 WHERE id = 4;

استخدم جدول مؤقت

// Reorder items
function update_items_tempdb(&$items)
{
    shuffle($items);
    $table_name = uniqid('tmp_test_');
    $sql = "CREATE TEMPORARY TABLE `$table_name` ("
        ."  `id` int(10) unsigned NOT NULL AUTO_INCREMENT"
        .", `position` int(10) unsigned NOT NULL"
        .", PRIMARY KEY (`id`)"
        .") ENGINE = MEMORY";
    query($sql);
    $i = 0;
    $sql = '';
    foreach ($items as &$item)
    {
        $item->position = $i++;
        $sql .= ($sql ? ', ' : '')."({$item->id}, {$item->position})";
    }
    if ($sql)
    {
        query("INSERT INTO `$table_name` (id, position) VALUES $sql");
        $sql = "UPDATE `test`, `$table_name` SET `test`.position = `$table_name`.position"
            ." WHERE `$table_name`.id = `test`.id";
        query($sql);
    }
    query("DROP TABLE `$table_name`");
}

استعمال

REPLACE INTO`table` VALUES (`id`,`col1`,`col2`) VALUES
(1,6,1),(2,2,3),(3,9,5),(4,16,8);

يرجى الملاحظة:

  • معرف يجب أن يكون مفتاح فريد رئيسي
  • إذا كنت تستخدم مفاتيح خارجية للإشارة إلى الجدول ، فسيقوم REPLACE بحذفها ، وبالتالي قد يتسبب ذلك في حدوث خطأ

سوف يقوم التالي بتحديث كافة الصفوف في جدول واحد

Update Table Set
Column1 = 'New Value'

سيتم تحديث الصفوف التالية حيث تكون قيمة Column2 أكثر من 5

Update Table Set
Column1 = 'New Value'
Where
Column2 > 5

يوجد كل Unkwntech لتحديث أكثر من جدول واحد

UPDATE table1, table2 SET
table1.col1 = 'value',
table2.col1 = 'value'
WHERE
table1.col3 = '567'
AND table2.col6='567'

قد تكون مهتمًا أيضًا باستخدام الإضافات على التحديثات ، وهو أمر ممكن أيضًا.

Update someTable Set someValue = 4 From someTable s Inner Join anotherTable a on s.id = a.id Where a.id = 4
-- Only updates someValue in someTable who has a foreign key on anotherTable with a value of 4.

تعديل: إذا كانت القيم التي تقوم بتحديثها لا تأتي من مكان آخر في قاعدة البيانات ، فستحتاج إلى إصدار استعلامات متعددة للتحديث.


لست متأكدا لماذا لم يتم ذكر خيار آخر مفيد بعد:

UPDATE my_table m
JOIN (
    SELECT 1 as id, 10 as _col1, 20 as _col2
    UNION ALL
    SELECT 2, 5, 10
    UNION ALL
    SELECT 3, 15, 30
) vals ON m.id = vals.id
SET col1 = _col1, col2 = _col2;

لماذا لا يذكر أحد عبارات متعددة في استعلام واحد ؟

في php ، تستخدم طريقة multi_query من مثيل mysqli.

من دليل php

يسمح MySQL اختياريًا بعدة عبارات في سلسلة عبارة واحدة. يؤدي إرسال عبارات متعددة في آنٍ واحد إلى تقليل الرحلات المستديرة بين العميل والخادم ، ولكنه يتطلب معالجة خاصة.

هنا هو نتيجة مقارنة مع 3 طرق أخرى في تحديث 30،000 الخام. يمكن العثور على الكود here والذي يعتمد على الإجابة منDakusan

المعاملة: 5.5194580554962
Insert: 0.20669293403625
الحالة: 16.474853992462
متعدد: 0.0412278175354

كما ترى ، فإن استعلام عبارات متعددة أكثر كفاءة من أعلى إجابة.

إذا تلقيت رسالة خطأ كهذه:

PHP Warning:  Error while sending SET_OPTION packet

قد تحتاج إلى زيادة max_allowed_packet في ملف التكوين mysql الذي هو في الجهاز /etc/mysql/my.cnf ثم /etc/mysql/my.cnf تشغيل mysqld.


نظرًا لأن لديك قيمًا ديناميكية ، تحتاج إلى استخدام IF أو CASE لتحديث الأعمدة. يحصل قبيحة كيندا ، ولكن يجب أن تعمل.

باستخدام المثال الخاص بك ، يمكنك القيام به مثل:

UPDATE table SET Col1 = CASE id 
                          WHEN 1 THEN 1 
                          WHEN 2 THEN 2 
                          WHEN 4 THEN 10 
                          ELSE Col1 
                        END, 
                 Col2 = CASE id 
                          WHEN 3 THEN 3 
                          WHEN 4 THEN 12 
                          ELSE Col2 
                        END
             WHERE id IN (1, 2, 3, 4);

نعم ، هذا ممكن - يمكنك استخدام INSERT ... ON DUBLICATE KEY UPDATE.

باستخدام المثال الخاص بك:

INSERT INTO table (id,Col1,Col2) VALUES (1,1,1),(2,2,3),(3,9,3),(4,10,12)
ON DUPLICATE KEY UPDATE Col1=VALUES(Col1),Col2=VALUES(Col2);

هناك إعداد يمكنك تغييره "البيان المتعدد" الذي يعمل على تعطيل "آلية الأمان" الخاصة بـ MySQL من أجل منع (أكثر من واحد) من أوامر الحقن. بشكل نموذجي لتطبيق MySQL "الرائع" ، فإنه يمنع أيضًا المستخدم من إجراء استعلامات فعالة.

هنا ( http://dev.mysql.com/doc/refman/5.1/en/mysql-set-server-option.html ) هو بعض المعلومات عن تنفيذ الإعداد C.

إذا كنت تستخدم PHP ، يمكنك استخدام mysqli للقيام بعدة عبارات (أعتقد أن php قد تم شحنها مع mysqli لفترة من الوقت الآن)

$con = new mysqli('localhost','user1','password','my_database');
$query = "Update MyTable SET col1='some value' WHERE id=1 LIMIT 1;";
$query .= "UPDATE MyTable SET col1='other value' WHERE id=2 LIMIT 1;";
//etc
$con->multi_query($query);
$con->close();

امل ان يساعد.


يمكنك تسمية نفس الجدول لتعطيك معرّف الهوية الذي تريد إدراجه بواسطة (إذا كنت تقوم بتحديث الصفوف عن طريق الصف:

UPDATE table1 tab1, table1 tab2 -- alias references the same table
SET 
col1 = 1
,col2 = 2
. . . 
WHERE 
tab1.id = tab2.id;

بالإضافة إلى ذلك ، يجب أن يبدو واضحًا أنه يمكنك أيضًا التحديث من الجداول الأخرى أيضًا. في هذه الحالة ، يتضاعف التحديث كإفادة "SELECT" ، مما يمنحك البيانات من الجدول الذي تحدده. أنت تفيد بوضوح في استعلاماتك قيم التحديث لذا ، فإن الجدول الثاني لا يتأثر.


UPDATE table1, table2 SET table1.col1='value', table2.col1='value' WHERE table1.col3='567' AND table2.col6='567'

هذا يجب أن يعمل من أجل يا.

يوجد مرجع في دليل MySQL لجداول متعددة.


UPDATE tableName SET col1='000' WHERE id='3' OR id='5'

هذا يجب أن يحقق ما تبحث عنه. فقط إضافة المزيد من الهوية. لقد اختبرت ذلك.







sql-update