SQL – Atualizar vários registros em uma consulta

Eu tenho table- config . Esquema: config_name | config_value config_name | config_value

E 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?

Tente a syntax 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

Você pode realizá-lo com INSERT como 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 estiver duplicada (já inserida na tabela), os valores especificados serão atualizados e o mesmo registro não será inserido na segunda vez.

no meu caso eu tenho que atualizar os registros que são mais de 1000, para isso ao invés de acertar a consulta de atualização toda vez que eu 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 do usuário e, para esse id do usuário, preciso atualizar o base_id 999 e 88, respectivamente. Isso funciona para mim.

talvez 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 

este registro existente de atualização SQL e insere novo (2 em um)

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

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

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

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

A solução de Camille funcionou. Transformou-a em uma function básica do PHP, que grava a instrução SQL. Espero que isso ajude alguém.

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