Actualizarea mai multor rânduri într-o singură interogare MySQL (Programare, Mysql, Sql)

user2618929 a intrebat.

Încerc să execut acest lucru:

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

Eroarea pe care o primesc:

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

Tabelul meu:

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

Este vorba de ceva despre , la sfârșitul primului rând. Când am schimbat-o în ;, , nu a recunoscut col2. Cum pot face acest lucru într-o singură interogare?

Comentarii

  • Posibil duplicat al articolului Actualizări multiple în MySQL. Veți găsi răspunsul acolo –  > Por Itay.
  • da, știu această soluție, dar în cazul meu, fiecare rând va exista deja în tabel (nu trebuie să fie inserat), deci ar rula întotdeauna ON DUPLICATE KEY UPDATE și ar face totul mult mai lent. –  > Por utilizator2618929.
  • Nu înțeleg ce vreți să spuneți. Utilizați INSERT comanda atunci când trebuie să faceți o actualizare și atât. Dacă folosiți o cheie primară nu va fi mult mai lent –  > Por Itay.
  • ok, voi face asta dacă nimeni nu va sugera o soluție mai bună, mulțumesc –  > Por utilizator2618929.
  • Ca să fie clar, dacă folosiți cheia primară (nu doar col1 = „test”) va fi destul de rapid. –  > Por Itay.
5 răspunsuri
user3435275

Acesta este cel mai clar mod

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

Comentarii

  • Nu este WHERE-part inutil? –  > Por Clox.
  • Fără WHERE, CASE va fi respinsă și va returna null (probabil nu este ceea ce dorește nimeni). Cred că adăugarea unui „ELSE col2” este mai sigură fără WHERE, dar va duce la actualizări inutile. –  > Por c0dem4gnetic.
  • @Clox, de asemenea, dacă nu includeți WHERE clauza, atunci mysql trebuie să treacă prin fiecare rând pentru a verifica. Sigur că nu va exista nicio problemă de performanță cu acest exemplu, dar imaginați-vă dacă aveți 1000 de rânduri și doriți să actualizați doar 2 rânduri. –  > Por Fahmi.
Ruud H.G. van Tol

Luați în considerare utilizarea INSERT-ODKU (ON DUPLICATE KEY UPDATE), deoarece aceasta permite actualizarea mai multor rânduri.

Asigurați-vă că valorile tuturor coloanelor PK se află în VALUES().

Dacă este posibil, generați SQL cu date de la un sclav.

John Woo

puteți utiliza CASE în acest caz

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

sau IF (pentru MySQL numai)

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

Comentarii

  • aș dori să adaug mult mai multe rânduri în viitor și cu mai multe coloane 🙁 Am dat doar un exemplu simplu la problema mea. –  > Por utilizator2618929.
  • @Itay ce înțelegi prin flexibil? –  > Por John Woo.
  • Vreau să spun că va fi foarte greu să actualizezi 100 de rânduri astfel. –  > Por Itay.
  • @user2618929 atunci construiți un sql dinamic. –  > Por John Woo.
  • @Itay deci puteți oferi o alternativă? –  > Por John Woo.
mnagel

în mod alternativ, atunci când construcția cu cases devine prea greu de citit, ați putea/ar trebui să porniți o tranzacție și să efectuați actualizările secvențial.

De obicei, acest lucru are ca rezultat un sql mai simplu, cu excepția cazului în care prima instrucțiune creează rânduri care sunt apoi potrivite de către a doua instrucțiune, când nu ar trebui să fie așa. totuși, nu este cazul în exemplul dvs.

JDrake

Iată cum am făcut-o:

UPDATE col1 (valoare statică), col2 (valoare statică), și col3 (valori diferite) WHERE col4 are valori diferite AND col5 este statică.

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

Iar șirul de ieșire pentru interogarea MySql ar fi ceva de genul acesta:

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'

Tags:,