Массовое обновление mysql с оператором where

Как массово обновить данные MySQL? Как определить что-то вроде этого:

UPDATE `table` 
WHERE `column1` = somevalues
SET  `column2` = othervalues

с некоторыми значениями, такими как:

VALUES
    ('160009'),
    ('160010'),
    ('160011');

и другие значения:

VALUES
    ('val1'),
    ('val2'),
    ('val3');

может быть, это невозможно с mysql? php-скрипт?


person user3673384    schedule 01.03.2016    source источник
comment
Поместите свои пары в таблицу поиска и присоединитесь к ней, чтобы создать свое обновление.   -  person LDMJoe    schedule 01.03.2016
comment
проверили ли вы этот ответ stackoverflow.com/questions/12960569/ mysql-массовая вставка через php   -  person ELITE    schedule 01.03.2016
comment
это можно сделать с помощью MySQL, без участия PHP. Посмотрите мой ответ ниже, он работает как шарм.   -  person Farside    schedule 01.03.2016


Ответы (3)


Самое простое решение в вашем случае — использовать ON DUPLICATE KEY UPDATE строительство. Он работает очень быстро, и делает работу легко.

INSERT into `table` (id, fruit)
    VALUES (1, 'apple'), (2, 'orange'), (3, 'peach')
    ON DUPLICATE KEY UPDATE fruit = VALUES(fruit);

или использовать конструкцию CASE

UPDATE table
SET column2 = (CASE column1 WHEN 1 THEN 'val1'
                 WHEN 2 THEN 'val2'
                 WHEN 3 THEN 'val3'
         END)
WHERE column1 IN(1, 2 ,3);
person Farside    schedule 01.03.2016
comment
Безопасно ли использовать это, даже если столбец fruit не уникален? Меня смущает утверждение в документах mysql: если вы укажете предложение ON DUPLICATE KEY UPDATE, а вставляемая строка приведет к дублированию значения в индексе UNIQUE или PRIMARY KEY, ОБНОВЛЕНИЕ старой строки произойдет в dev.mysql.com/doc/refman/5.7/en/ вставка-на-дубликате.html. - person kovac; 20.02.2018
comment
@swdon, вопрос, который вы задали, противоречит базовым знаниям MySQL. ПЕРВИЧНЫЕ КЛЮЧИ УНИКАЛЬНЫ. первичный ключ таблицы по определению является уникальным ключом. - person Farside; 20.02.2018
comment
Извините, я действительно перепутал. В моем случае первичный ключ является автоматически увеличивающимся значением, и оператор обновления проверял какой-либо другой столбец, который не является ни первичным ключом, ни уникальным. Но я понял, что вы имели в виду в исходном ответе. - person kovac; 21.02.2018
comment
Этот ON DUPLICATE KEY выглядит как хороший метод, но обратите внимание (без mysql), если какое-либо поле в таблице не имеет значения по умолчанию, оно не будет выполнено. Таким образом, вам нужно ввести какое-то значение-заполнитель, чтобы пройти это ограничение, что снижает переносимость этого решения. - person Dankó Dávid; 19.10.2018
comment
Будьте осторожны с операторами ON DUPLICATE KEY в MySQL, они приведут к увеличению столбца auto_increment, даже если вы не вставляете новую строку. Вы можете очень быстро прожечь МНОГО значений auto_increment, если вы выполняете массовое обновление с помощью ON DUPLICATE KEY. Убедитесь, что ваше поле auto_increment достаточно велико для этого. - person Jeff Kilbride; 09.07.2021

Если «объемные» данные, которые у вас есть, являются динамическими и поступают из PHP (в конце концов, вы их пометили), тогда запрос будет выглядеть примерно так:

INSERT INTO `foo` (id, bar)
VALUES 
    (1, 'pineapple'),
    (2, 'asian pear'),
    (5, 'peach')
ON DUPLICATE KEY UPDATE bar = VALUES(bar);

и PHP для создания этого из существующего массива (при условии, что массив имеет такой формат, как:

$array = (
    somevalues_key => othervalues_value
);

) будет выглядеть примерно так (ни в коем случае не лучшим (например, не касается экранирования или очистки значений), просто быстрый пример):

$pairs = array();
foreach ($array as $key => $value) {
    $pairs[] = "($key, '$value')";
}

$query = "INSERT INTO `foo` (id, bar) VALUES " . implode(', ', $pairs) . " ON DUPLICATE KEY UPDATE bar = VALUES(bar)";
person Davis    schedule 01.03.2016
comment
Дэвис, когда я запускаю верхний оператор, который вы написали, он работает в таблице, где есть только столбцы id и bar. Но если таблица содержит больше, чем id и bar, например id,bar,date, она не работает. Нужно ли указывать каждый столбец, даже если он не нуждается в обновлении? - person Bonxy; 26.05.2018
comment
@Bonxy, в этом случае ваш запрос должен измениться следующим образом, у меня это сработало. ВСТАВИТЬ В foo (id, bar, date) ЗНАЧЕНИЯ (1, 'ананас', d1), (2, 'азиатская груша', d2), (5, 'персик', d3) НА ОБНОВЛЕНИИ ДУБЛИКАЦИИ КЛЮЧА bar = VALUES(bar ), дата = значения (дата); - person Satys; 24.05.2019

Если у вас есть данные в формате массива, попробуйте это

и ваш запрос похож на "UPDATE table WHERE column1 = ? SET column2 = ?"

затем установите его, как показано ниже

foreach($data as $key => $value) {
    $query->bind_param('ss', $key, $value);
    $query->execute();
}

надеюсь, это сработает.

Ссылка из этого.

person Virus    schedule 01.03.2016