от
Я знаю, что вы можете вставить несколько строк сразу, есть ли способ, чтобы обновить несколько строк одновременно (в одном запросе) в 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;

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.

18 Ответы

0 голосов
от
Я знаю, что вы можете вставить несколько строк сразу, есть ли способ, чтобы обновить несколько строк одновременно (в одном запросе) в 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;
0 голосов
от
Да, это возможно - вы можете использовать вставить ... на дубликат ключа обновления. Используя Ваш пример:
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);
0 голосов
от
Поскольку у вас есть динамические значения, необходимо использовать, если Или случае для столбцов, которые будут обновлены. Это немного некрасиво, но он должен работать. Используя Ваш пример, вы могли бы сделать это как: Настольный набор обновлений столбца col1 = идентификатор КОГДА 1 ТОГДА 1 КОГДА 2 ТОГДА 2 ПРИ 4 И 10 Еще на col1 Конец, Столбец col2 = чехол ID ЕСЛИ 3, ТО 3 КОГДА 4 ПОТОМ 12 Еще и col2 Конец Где ID в (1, 2, 3, 4);
0 голосов
от
Вопрос старый, но я бы хотел продлить тему с другого ответа. На мой взгляд, самый простой способ достичь этого-это просто обернуть несколько запросов с проводкой. Принято отвечать
INSERT ... ON DUPLICATE KEY UPDATE
-это красивая поделка, но необходимо учитывать свои недостатки и ограничения: Как говорится, если вам случится, чтобы запустить запрос с строки первичные ключи, которых не существует в таблице, то запрос вставляет новые "новоиспеченные" записей. Наверное, это не то, что вы хотите Если у вас есть таблица с не null поля без значений по умолчанию и не хочу трогать это поле в запросе, вы получите
"Field 'fieldname' doesn't have a default value"
MySQL и предупреждения, даже если вы не вставить одну строку на всех. Это поможет вам в беде, если вы решили быть строгими и предупреждений о поворотах MySQL в исключения на этапе выполнения приложения. Я сделал некоторые тесты производительности для трех предложенных вариантов, включая вариант
INSERT ... ON DUPLICATE KEY UPDATE
, вариант с "когда / тогда" оговорки и наивный подход с проводкой. Вы можете получить код Python и результаты здесь. Общий вывод заключается в том, что вариант с заявлением, дело, оказывается, в два раза быстрее двух других вариантов, но это довольно трудно писать правильно и внедрение кода просмотра, так что я лично придерживаюсь простой подход: использование транзакций. Редактировать: результаты Dakusan доказать, что мои расчеты не совсем корректным. Пожалуйста, см. Этот ответ для других, более сложных исследований.
0 голосов
от
Не знаю, почему еще одна полезная опция еще не упомянули:
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;
0 голосов
от
Все из перечисленного относится к InnoDB. Я чувствую, зная скоростей 3 различными методами-это важно. Есть 3 способа: Вставка: вставка на дубликат ключа обновления Сделки: где вы делаете обновление для каждой записи в рамках транзакции Случай: в котором вы в случае, когда для каждой записи в обновление Я просто проверял это, и метод Insert составил 6,7 X быстрее для меня, чем метод операции. Я пробовал на обоих 3000 и 30 000 строк. Метод сделка еще должна бегать каждый индивидуально запрос, который занимает много времени, хотя он пачками результатов в память, или что-то, во время выполнения. Метод сделок-это также довольно дорого в репликации и журналы запросов. Еще хуже, кейс-метода составляла 41,1 х медленнее, чем метод Insert Вт/ 30 000 записей (6.1 х медленнее, чем операция). И 75х медленнее в MyISAM. Влом вставлять и методов даже при ~1000 записей. Даже на 100 записей, кейс-метод-это едва быстрее. Так что в целом, я чувствую, что метод Insert является лучшим и простым в использовании. Запросы меньше и легче читать и принимать только до 1 запроса действий. Это касается как InnoDB и MyISAM. Бонус вещей: Решение для вставки по умолчанию-проблемное поле-временно отключить соответствующие режимы SQL:
SET SESSION sql_mode=REPLACE(REPLACE(@@SESSION.sql_mode,"STRICT_TRANS_TA‌​BLES",""),"STRICT_AL‌​L_TABLES","")
. Обязательно сохраните сначала
sql_mode
, если вы планируете вернуть его. Что касается других комментариев, которые я видел, которые говорят, что типа AUTO_INCREMENT идет вверх, используя метод Insert, я проверял, и это, кажется, не быть случай. Код для выполнения тестов осуществляется следующим образом. Он также выводит .SQL-файлы, чтобы удалить PHP-интерпретатор накладные
0 голосов
от
UPDATE table1, table2 SET table1.col1='value', table2.col1='value' WHERE table1.col3='567' AND table2.col6='567'
Это должно работать для вас. Есть ссылка в руководстве по MySQL для нескольких таблиц.
0 голосов
от
Использовать временную таблицу
// Reorder items
function update_items_tempdb(
0 голосов
от
Вы можете псевдоним одной и той же таблицы, чтобы дать вам код, который вы хотите вставить (если вы делаете построчном обновлении:
UPDATE table1 tab1, table1 tab2 

Кроме того, казалось бы очевидно, что вы также можете обновить с другими столами. В этом случае обновление удваивается как "Выберите" заявление, давая вам данные из таблицы указывается. Вы находитесь явного указания в запросе на обновление значений так, во второй таблице не влияет.
0 голосов
от
Почему никто не упоминает несколько операторов в одном запросе? В PHP, вы используете метод
multi_query
по двум экземпляру. От Руководство по PHP В MySQL дополнительно позволяет иметь несколько инструкций в одной строке инструкции. Отправка нескольких инструкций одновременно уменьшает клиент-сервер ходок, но требует специальной обработки. Вот результат по сравнению с другими 3 метода обновления 30,000 сырья. Код можно найти здесь, который является на основе ответа от @Dakusan Сделки: 5.5194580554962 Вставка: 0.20669293403625 Корпус: 16.474853992462 Мульти: 0.0412278175354 Как вы можете видеть, несколько запросов является более эффективным, чем ответить. Если вы получаете такое сообщение об ошибке:
PHP Warning:  Error while sending SET_OPTION packet
Вам может потребоваться увеличить
max_allowed_packet
в файле MySQL конфиг, который в моей машине это
/etc/mysql/my.cnf
и затем перезапустить mysqld.
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...