Atualizar vários registros em uma consulta

132

Eu tenho tabela - 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 :(

Pode me ajudar?

user3022527
fonte
1
Qual banco de dados você está usando?
Hart CO
Estou usando o banco de dados MySQL.
user3022527
Atualizar a partir de Select pode ser a resposta stackoverflow.com/questions/2334712/…
Jonathan Benn

Respostas:

167

Experimente a sintaxe de atualização de várias tabelas

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á a demonstração do SQLFiddle

ou atualizaçã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á a demonstração do SQLFiddle

peterm
fonte
1
Sim, tudo bem, mas e quando eu gostaria de atualizar 16 registros em uma consulta? Eu devo usar JOIN x 16?
user3022527
19
Você deve mencionar esses detalhes importantes em sua pergunta em primeiro lugar. De qualquer forma, veja a resposta atualizada para outra solução (atualização condicional).
Peterm
1
O que é t1 e t2 em seus exemplos?
Paul Brewczynski
1
Olá a você também @PaulBrewczynski. Esses são aliases da tabela e podem ser gravados config AS t1onde ASé opcional.
Peterm
@ Peter: os links do SQLFiddle estão quebrados. Caso contrário, a técnica de atualização condicional está funcionando muito bem. Obrigado!
Jonathan Benn
142

Você pode fazer isso com INSERT, conforme 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);

Isso insere novos valores na tabela, mas se a chave primária for duplicada (já inserida na tabela), os valores especificados serão atualizados e o mesmo registro não será inserido na segunda vez.

camille khalaghi
fonte
26
um truque bastante inteligente. Estou impressionado.
Blaise
6
Não é suportado para Postgres ver: stackoverflow.com/questions/1109061/...
kevzettler
Além disso, é uma ótima maneira de transformar um pouco de CSV (ou muito) em uma inserção / atualização / upsert de tabela com algumas pequenas edições de texto!
wulftone
6
Esta é uma solução MySQL, não Postgres ou MSSQL.
Rz Mk
1
Isso irá incrementar o ID autoincrement, mesmo se o registro não é inserida ou atualizada
Timo Huovinen
15

no meu caso, tenho que atualizar os registros maiores que 1000, para isso, em vez de acessar a consulta de atualização sempre que preferir 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 de usuário e, para esses IDs, preciso atualizar o base_id 999 e 88 respectivamente. Isso funciona para mim.

vaibhav kulkarni
fonte
Um dos melhores aqui, funcionou muito bem para mim.
Shahrukh Anwar
7

talvez para alguém seja útil

para o Postgresql 9.5 funciona como um 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

esse SQL atualiza o registro existente e insere se novo (2 em 1)

Oleg Sobchuk
fonte
1
Como posso ver, o id é pk para a tabela de acordo com sua consulta. Suponha que haja 2 ou mais colunas consideradas como pk (chave composta) ... Nesse caso, qual deve ser a maneira correta de verificar o conflito.
Sritam Jagadev 13/09
6

A solução de Camille funcionou. Transformado em uma função básica do PHP, que grava a instrução SQL. Espero que isso 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;
    }
adamk
fonte
5

em vez disso

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

você pode usar

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

Execute o código abaixo para atualizar n número de linhas, onde ID pai é o ID do qual você deseja obter os dados e IDs filhos são os IDs que você precisa atualizar, portanto, é necessário adicionar o ID pai e os IDs filhos para atualizar todas as linhas que você precisa usando um pequeno 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
fonte
2

Supondo que você tenha a lista de valores a serem atualizados em uma planilha do Excel com config_value na coluna A1 e config_name em B1, você pode facilmente escrever a consulta lá usando uma fórmula do Excel como

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

Ivar
fonte
1

Execute o código abaixo se desejar atualizar todos os registros em todas as colunas:

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

e se você deseja atualizar todas as colunas de uma linha específica, execute o código abaixo:

update config set column1='value',column2='value'...columnN='value' where column1='value'
Jason Clark
fonte
3
e se um valor diferente em uma linha diferente? por exemplo, equipe UPDATE SET salário = 1125 WHERE nome = 'Bob'; ATUALIZAR equipe Definir salário = 1200 WHERE name = 'Jane'; ATUALIZAR equipe Definir salário = 1100 WHERE name = 'Frank'; ATUALIZAR equipe Definir salário = 1175 WHERE name = 'Susan'; ATUALIZAR equipe Definir salário = 1150 WHERE name = 'John';
Abdullah Nurum 13/02/19