web-dev-qa-db-fra.com

Mettre à jour plusieurs lignes dans une seule requête MySQL

J'essaye de courir ceci:

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

L'erreur que j'obtiens:

[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 '

Ma table:

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

C’est quelque chose à propos de , à la fin de la première ligne. Quand je l'ai changé en ;, il n'a pas reconnu col2. Comment puis-je faire cela en une seule requête?

29
user2618929

C'est le moyen le plus clair

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')
38
user3435275

Pensez à utiliser INSERT-ODKU (ON DUPLICATE KEY UPDATE), car cela permet de mettre à jour plusieurs lignes.

Assurez-vous que les valeurs de toutes les colonnes PK sont dans VALUES ().

Si possible, générez le code SQL avec les données d'un esclave.

4

vous pouvez utiliser CASE sur cette

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

ou IF (pour MySQL seulement)

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

sinon, lorsque la construction avec cases devient trop illisible, vous pouvez/devriez commencer une transaction et effectuer les mises à jour de manière séquentielle.

cela se traduit généralement par un SQL plus simple, sauf si les premières instructions créent des lignes qui sont ensuite mises en correspondance avec les secondes alors qu'elles ne le devraient pas. Cependant, ce n'est pas le cas dans votre exemple.

1
mnagel

Voici comment je l'ai fait:

UPDATE col1 (valeur statique), col2 (valeur statique) et col3 (valeurs différentes) WHERE col4 a des valeurs différentes AND col5 est statique.

$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 */
    }

Et la chaîne de sortie pour la requête MySql ressemblerait à ceci:

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'
0
JDrake