web-dev-qa-db-fra.com

SQL - Mettre à jour plusieurs enregistrements dans une requête

J'ai table - config . Schema: config_name | config_value

Et je voudrais mettre à jour plusieurs enregistrements dans une requête. J'essaye comme ça: 

UPDATE config 
SET t1.config_value = 'value'
  , t2.config_value = 'value2' 
WHERE t1.config_name = 'name1' 
  AND t2.config_name = 'name2';

mais cette requête est fausse :( 

Pouvez-vous m'aider?

97
user3022527

Essayez soit la syntaxe de mise à jour multi-table 

UPDATE config t1 JOIN config t2
    ON t1.config_name = 'name1' AND t2.config_name = 'name2'
   SET t1.config_value = 'value',
       t2.config_value = 'value2';

Voici SQLFiddle démo

ou mise à jour conditionnelle

UPDATE config
   SET config_value = CASE config_name 
                      WHEN 'name1' THEN 'value' 
                      WHEN 'name2' THEN 'value2' 
                      ELSE config_value
                      END
 WHERE config_name IN('name1', 'name2');

Voici SQLFiddle démo

122
peterm

Vous pouvez le faire avec INSERT comme ci-dessous:

INSERT INTO mytable (id, a, b, c)
VALUES (1, 'a1', 'b1', 'c1'),
(2, 'a2', 'b2', 'c2'),
(3, 'a3', 'b3', 'c3'),
(4, 'a4', 'b4', 'c4'),
(5, 'a5', 'b5', 'c5'),
(6, 'a6', 'b6', 'c6')
ON DUPLICATE KEY UPDATE id=VALUES(id),
a=VALUES(a),
b=VALUES(b),
c=VALUES(c);

Cela insère de nouvelles valeurs dans la table, mais si la clé primaire est dupliquée (déjà insérée dans la table), les valeurs que vous spécifiez seront mises à jour et le même enregistrement ne sera pas inséré une seconde fois.

99
camille khalaghi

dans mon cas, je dois mettre à jour les enregistrements qui sont plus de 1000, pour cela au lieu d'appuyer sur la requête de mise à jour à chaque fois que je préférais cela, 

   UPDATE mst_users 
   SET base_id = CASE user_id 
   WHEN 78 THEN 999 
   WHEN 77 THEN 88 
   ELSE base_id END WHERE user_id IN(78, 77)

78,77 sont les ID utilisateur et pour ceux-ci, j'ai besoin de mettre à jour les identifiants base_id 999 et 88 respectivement. Cela fonctionne pour moi.

8
vaibhav kulkarni

peut-être que ce sera utile pour quelqu'un

pour Postgresql 9.5 fonctionne comme un charme

INSERT INTO tabelname(id, col2, col3, col4)
VALUES
    (1, 1, 1, 'text for col4'),
    (DEFAULT,1,4,'another text for col4')
ON CONFLICT (id) DO UPDATE SET
    col2 = EXCLUDED.col2,
    col3 = EXCLUDED.col3,
    col4 = EXCLUDED.col4

ce SQL met à jour l'enregistrement existant et l'insère s'il est nouveau (2 en 1)

4
Oleg Sobchuk

Exécutez le code ci-dessous si vous souhaitez mettre à jour tous les enregistrements de toutes les colonnes:

update config set column1='value',column2='value'...columnN='value';

et si vous souhaitez mettre à jour toutes les colonnes d'une ligne particulière, exécutez le code ci-dessous:

update config set column1='value',column2='value'...columnN='value' where column1='value'
2
Jason Clark

La solution de Camille a fonctionné. En fait une fonction de base PHP, qui écrit l’instruction SQL. J'espère que ceci aide quelqu'un d'autre.

    function _bulk_sql_update_query($table, $array)
    {
        /*
         * Example:
        INSERT INTO mytable (id, a, b, c)
        VALUES (1, 'a1', 'b1', 'c1'),
        (2, 'a2', 'b2', 'c2'),
        (3, 'a3', 'b3', 'c3'),
        (4, 'a4', 'b4', 'c4'),
        (5, 'a5', 'b5', 'c5'),
        (6, 'a6', 'b6', 'c6')
        ON DUPLICATE KEY UPDATE id=VALUES(id),
        a=VALUES(a),
        b=VALUES(b),
        c=VALUES(c);
    */
        $sql = "";

        $columns = array_keys($array[0]);
        $columns_as_string = implode(', ', $columns);

        $sql .= "
      INSERT INTO $table
      (" . $columns_as_string . ")
      VALUES ";

        $len = count($array);
        foreach ($array as $index => $values) {
            $sql .= '("';
            $sql .= implode('", "', $array[$index]) . "\"";
            $sql .= ')';
            $sql .= ($index == $len - 1) ? "" : ", \n";
        }

        $sql .= "\nON DUPLICATE KEY UPDATE \n";

        $len = count($columns);
        foreach ($columns as $index => $column) {

            $sql .= "$column=VALUES($column)";
            $sql .= ($index == $len - 1) ? "" : ", \n";
        }

        $sql .= ";";

        return $sql;
    }
1
adamk

au lieu de cela

UPDATE staff SET salary = 1200 WHERE name = 'Bob';
UPDATE staff SET salary = 1200 WHERE name = 'Jane';
UPDATE staff SET salary = 1200 WHERE name = 'Frank';
UPDATE staff SET salary = 1200 WHERE name = 'Susan';
UPDATE staff SET salary = 1200 WHERE name = 'John';

vous pouvez utiliser

UPDATE staff SET salary = 1200 WHERE name IN ('Bob', 'Frank', 'John');
0
Shuhad zaman

En supposant que vous ayez la liste des valeurs à mettre à jour dans une feuille de calcul Excel avec valeur_config dans colonne A1 et nom_config dans B1 vous pouvez facilement y écrire la requête à l'aide d'une formule Excel comme

=CONCAT("UPDATE config SET config_value = ","'",A1,"'", " WHERE config_name = ","'",B1,"'")

0
Ivar