SQL-actualizar vários registos numa consulta

tenho mesa - config . Esquema: config_name | config_value

E eu gostaria de atualizar vários registros em uma consulta. Eu tento assim:
UPDATE config 
SET t1.config_value = 'value'
  , t2.config_value = 'value2' 
WHERE t1.config_name = 'name1' 
  AND t2.config_name = 'name2';

mas essa consulta está errada: (

Podes ajudar-me?

 88
Author: Hart CO, 2013-11-28

6 answers

Tente a sintaxe de actualização multi-tabela

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';
Aqui está. SQLFiddle demo

Ou actualização 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');
Aqui está. SQLFiddle demo
 105
Author: peterm, 2013-11-27 23:40:41

Pode realizá-lo com a inserção abaixo:

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

Este introduz novos valores na tabela, mas se a chave primária for duplicada (já inserida na tabela) que os valores que indicar serão actualizados e o mesmo registo não será inserido pela segunda vez.

 87
Author: camille khalaghi, 2015-02-09 19:23:17

No meu caso, eu tenho que atualizar os registros que são mais de 1000, para isso, em vez de bater a consulta de Atualização cada vez que eu preferia isso,

   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 são os Ids do utilizador e, para esses IDs, preciso de actualizar o base_id 999 e 88, respectivamente.Isto funciona comigo.

 5
Author: vaibhav kulkarni, 2016-12-20 05:37:17
Talvez alguém possa ser útil.

Para o Postgresql 9.5 funciona como um encanto {[[3]}

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 o registo existente e insere um novo (2 num)

 3
Author: Oleg Sobchuk, 2017-11-06 09:56:32

Execute o código abaixo se quiser actualizar todos os registos em todas as colunas:

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

E se quiser actualizar todas as colunas de uma linha em particular, então execute abaixo do Código:

update config set column1='value',column2='value'...columnN='value' where column1='value'
 2
Author: Jason Clark, 2016-12-20 06:23:19
A solução da Camille funcionou. Transformou-o em uma função PHP básica, que escreve a declaração SQL. Espero que isto ajude outra pessoa.
    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;
    }
 0
Author: adamk, 2018-03-07 06:32:41