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?
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')
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.
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')
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.
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'