SQL: actualice varios registros en una consulta

132

Tengo tabla - config . Esquema: config_name | config_value

Y me gustaría actualizar varios registros en una consulta. Lo intento así:

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

pero esa consulta es incorrecta :(

¿Me puedes ayudar?

usuario3022527
fuente
1
¿Qué base de datos estás utilizando?
Hart CO
Estoy usando la base de datos MySQL.
user3022527
La actualización de Select podría ser la respuesta stackoverflow.com/questions/2334712/…
Jonathan Benn

Respuestas:

167

Pruebe con la sintaxis de actualización de varias tablas

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

Aquí está la demostración SQLFiddle

o actualización condicional

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

Aquí está la demostración SQLFiddle

peterm
fuente
1
Sí, está bien, pero ¿qué sucede cuando me gustaría actualizar 16 registros en una consulta? ¿Debo usar JOIN x 16?
user3022527
19
En primer lugar, debe mencionar detalles tan importantes en su pregunta. De todos modos, vea la respuesta actualizada para otra solución (actualización condicional).
Peter
1
¿Qué es t1 y t2 en tus ejemplos?
Paul Brewczynski
1
Hola a ti también @PaulBrewczynski. Estos son alias de tabla y se pueden escribir config AS t1donde ASsea ​​opcional.
Peter
@peterm: los enlaces SQLFiddle están rotos. De lo contrario, la técnica de actualización condicional funciona muy bien. ¡Gracias!
Jonathan Benn
142

Puede lograrlo con INSERT de la siguiente manera:

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

Esto inserta nuevos valores en la tabla, pero si la clave primaria está duplicada (ya insertada en la tabla), los valores que especifique se actualizarán y el mismo registro no se insertará la segunda vez.

camille khalaghi
fuente
26
Un truco bastante inteligente. Estoy asombrado.
Blaise
66
No es compatible con Postgres, consulte: stackoverflow.com/questions/1109061/…
kevzettler el
Además, es una excelente manera de convertir un poco de CSV (o mucho) en una inserción / actualización / inserción de tabla con alguna edición de texto menor.
wulftone
66
Esta es una solución MySQL, no Postgres o MSSQL.
Rz Mk
1
Esto aumentará la identificación de autoincremento, incluso si el registro no se inserta o actualiza
Timo Huovinen
15

en mi caso, tengo que actualizar los registros que son más de 1000, para esto en lugar de presionar la consulta de actualización cada vez que prefería esto,

   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 son los ID de usuario y para esos ID de usuario necesito actualizar el base_id 999 y 88 respectivamente. Esto funciona para mí.

vaibhav kulkarni
fuente
Uno de los mejores aquí, funcionó muy bien para mí.
Shahrukh Anwar
7

tal vez para alguien sea útil

para Postgresql 9.5 funciona como un encanto

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

este SQL actualiza el registro existente e inserta si es nuevo (2 en 1)

Oleg Sobchuk
fuente
1
Como puedo ver, id es pk para la tabla según su consulta. Suponga que hay 2 o más columnas consideradas como pk (clave compuesta) ... En ese caso, ¿cuál debería ser la forma correcta de verificar el conflicto?
Sritam Jagadev
6

La solución de Camille funcionó. Lo convirtió en una función básica de PHP, que escribe la declaración SQL. Espero que esto ayude a alguien más.

    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;
    }
adamk
fuente
5

en lugar de esto

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

puedes usar

UPDATE staff SET salary = 1200 WHERE name IN ('Bob', 'Frank', 'John');
Shuhad Zaman
fuente
3

Ejecute el siguiente código para actualizar n número de filas, donde la ID principal es la identificación de la que desea obtener los datos y las identificaciones secundarias son las que necesita actualizar, por lo que solo necesita agregar la identificación principal y las identificaciones secundarias para actualizar todas las filas que necesitas usando un pequeño script.

    UPDATE [Table]
 SET couloumn1= (select couloumn1 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn2= (select couloumn2 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn3= (select couloumn3 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn4= (select couloumn4 FROM Table WHERE IDCouloumn = [PArent ID]),
 WHERE IDCouloumn IN ([List of child Ids])
Harrish Selvarajah
fuente
2

Suponiendo que tiene la lista de valores para actualizar en una hoja de cálculo de Excel con config_value en la columna A1 y config_name en B1 , puede escribir fácilmente la consulta allí usando una fórmula de Excel como

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

Ivar
fuente
1

Ejecute el siguiente código si desea actualizar todos los registros en todas las columnas:

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

y si desea actualizar todas las columnas de una fila en particular, ejecute el siguiente código:

update config set column1='value',column2='value'...columnN='value' where column1='value'
Jason Clark
fuente
3
¿Qué pasa si un valor diferente en una fila diferente? por ejemplo ACTUALIZAR personal SET salario = 1125 DONDE nombre = 'Bob'; ACTUALIZAR el salario del personal SET = 1200 WHERE name = 'Jane'; ACTUALIZAR el personal SET salario = 1100 DONDE nombre = 'Frank'; ACTUALIZAR el personal SET salario = 1175 DONDE nombre = 'Susan'; ACTUALIZAR el personal SET salario = 1150 DONDE nombre = 'John';
Abdullah Nurum