Несколько обновлений в MySQL - PullRequest
       102

Несколько обновлений в MySQL

353 голосов
/ 06 августа 2008

Я знаю, что вы можете вставить несколько строк одновременно, есть ли способ обновить несколько строк одновременно (как в одном запросе) в MySQL?

Edit: Например, у меня есть следующее

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;

Ответы [ 17 ]

2 голосов
/ 07 марта 2011

Существует параметр, который вы можете изменить, который называется «multi оператор», который отключает «механизм безопасности» 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();

Надеюсь, это поможет.

0 голосов
/ 15 марта 2016

использование

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

Обратите внимание:

  • идентификатор должен быть первичным уникальным ключом
  • если вы используете внешние ключи для ссылаясь на таблицу, REPLACE удаляет, а затем вставляет, так что вызвать ошибку
0 голосов
/ 30 сентября 2015

С PHP я сделал это. Используйте точку с запятой, разбейте ее на массив и отправьте через цикл.

$con = new mysqli('localhost','user1','password','my_database');
$batchUpdate = true; /*You can choose between batch and single query */
$queryIn_arr = explode(";", $queryIn);

if($batchUpdate)    /* My SQL prevents multiple insert*/
{
    foreach($queryIn_arr as $qr)
    {
        if(strlen($qr)>3)
        {
            //echo '<br>Sending data to SQL1:<br>'.$qr.'</br>';
            $result = $conn->query($qr);
        }

    }
}
else
{
    $result = $conn->query($queryIn);
}
$con->close();
0 голосов
/ 09 августа 2014

Да .. это возможно с помощью оператора INSERT ON DUPLICATE KEY UPDATE sql .. синтаксис: INSERT INTO table_name (a, b, c) ЗНАЧЕНИЯ (1,2,3), (4,5,6) ОБНОВЛЕНИЕ КЛЮЧЕВОГО КЛЮЧА a = ЗНАЧЕНИЯ (a), b = ЗНАЧЕНИЯ (b), c = ЗНАЧЕНИЯ (c)

0 голосов
/ 06 августа 2008
UPDATE tableName SET col1='000' WHERE id='3' OR id='5'

Это должно достичь того, что вы ищете. Просто добавьте больше идентификаторов. Я проверил это.

0 голосов
/ 28 августа 2013
UPDATE `your_table` SET 

`something` = IF(`id`="1","new_value1",`something`), `smth2` = IF(`id`="1", "nv1",`smth2`),
`something` = IF(`id`="2","new_value2",`something`), `smth2` = IF(`id`="2", "nv2",`smth2`),
`something` = IF(`id`="4","new_value3",`something`), `smth2` = IF(`id`="4", "nv3",`smth2`),
`something` = IF(`id`="6","new_value4",`something`), `smth2` = IF(`id`="6", "nv4",`smth2`),
`something` = IF(`id`="3","new_value5",`something`), `smth2` = IF(`id`="3", "nv5",`smth2`),
`something` = IF(`id`="5","new_value6",`something`), `smth2` = IF(`id`="5", "nv6",`smth2`) 

// Вы просто строите это в php как

$q = 'UPDATE `your_table` SET ';

foreach($data as $dat){

  $q .= '

       `something` = IF(`id`="'.$dat->id.'","'.$dat->value.'",`something`), 
       `smth2` = IF(`id`="'.$dat->id.'", "'.$dat->value2.'",`smth2`),';

}

$q = substr($q,0,-1);

Таким образом, вы можете обновить таблицу отверстий одним запросом

0 голосов
/ 06 августа 2008

Следующее обновит все строки в одной таблице

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...