Подтвердить что ты не робот

Обновление нескольких строк в одном запросе MySQL

Я пытаюсь запустить это:

UPDATE test 
SET col2=1 WHERE col1='test1', 
SET col2=3 WHERE col1='test2';

Ошибка, которую я получаю:

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '

Моя таблица:

CREATE TABLE `test` (
    `col1` varchar(30) NOT NULL,
    `col2` int(5) DEFAULT NULL,
    PRIMARY KEY (`col1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Что-то о , в конце первой строки. Когда я изменил его на ;, он не узнал col2. Как это сделать в одном запросе?

4b9b3361

Ответ 1

Это наиболее понятный способ

UPDATE test
SET col2 = CASE col1
WHEN 'test1' THEN 1
WHEN 'test2' THEN 3
WHEN 'test3' THEN 5
END,
colx = CASE col1
WHEN 'test1' THEN 'xx'
WHEN 'test2' THEN 'yy'
WHEN 'test3' THEN 'zz'
END
WHERE col1 IN ('test1','test2','test3')

Ответ 2

Рассмотрим использование INSERT-ODKU (ON DUPLICATE KEY UPDATE), поскольку это поддерживает обновление нескольких строк.

Убедитесь, что значения всех столбцов PK находятся в VALUES().

По возможности, сгенерируйте SQL с данными из подчиненного устройства.

Ответ 3

вы можете использовать CASE на этом

UPDATE test 
SET col2 = CASE WHEN col1 = 'test1' THEN 1 ELSE 3 END 
WHERE col1 IN ('test1', 'test2')

или IF (только для MySQL)

UPDATE test 
SET col2 = IF(col1 = 'test1', 1, 3)
WHERE col1 IN ('test1', 'test2')

Ответ 4

альтернативно, когда конструкция с cases становится слишком нечитаемой, вы можете/должны начать транзакцию и просто выполнять обновления последовательно.

это обычно приводит к более простому sql, за исключением случаев, когда первые операторы создают строки, которые затем сопоставляются вторым оператором, когда они не должны. однако в вашем примере это не так.

Ответ 5

Вот как я это сделал:

UPDATE col1 (статическое значение), col2 (статическое значение) и col3 (разные значения) WHERE col4 имеет разные значения AND col5 является статическим.

$someArray = ["a","b","c"];
$anotherArray = [1,2,3];

$sql = "UPDATE table SET col1 = '$staticValue1', col2 = '$staticValue2', col3 = CASE col4";
    $sqlEnd = " END WHERE col4 IN (";
    $seperator = ",";
    for ( $c = 0; $c < count($someArray); $c++ ) {
       $sql .= " WHEN " . "'" . $someArray[$c] . "'" . " THEN " . $anotherArray[$c];
       if ( $c === count($someArray) - 1 ) { 
          $separator = ") AND col5 = '$staticValue5'";
       }
        $sqlEnd .= "'" . $someArray[$c] . "'" . $seperator;

    }
    $sql .= $sqlEnd;
    $retval = mysqli_query( $conn, $sql);
    if(! $retval ) {
        /* handle error here */
    }

И строка вывода для запроса MySql будет выглядеть примерно так:

UPDATE table SET col1 = '1', col2 = '2', col3 = CASE col4 WHEN 'a' THEN 1 WHEN 'b' THEN 2 WHEN 'c' THEN 3 END WHERE col4 IN ('a','b','c') AND col5 = 'col5'

Ответ 6

UPDATE `wp_partners_tarif` SET  `name`="name1",`cena`="1",`comisiya`="11" WHERE `id`=2;
UPDATE `wp_partners_tarif` SET  `name`="name2",`cena`="2",`comisiya`="22" WHERE `id`=3;
UPDATE `wp_partners_tarif` SET  `name`="name2",`cena`="3",`comisiya`="33" WHERE `id`=4