update - modificar datos de una tabla mysql
SQL: actualiza mĂșltiples registros en una consulta (6)
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 quiere 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''
Tengo table - config . Esquema: config_name | config_value
config_name | config_value
Y me gustaría actualizar múltiples 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?
La solución de Camille funcionó. Se convirtió en una función básica de PHP, que escribe la declaración de 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;
}
Pruebe la sintaxis de actualización multi-tabla
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 de 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 de SQLFiddle
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 se ha insertado en la tabla), los valores que especifique se actualizarán y el mismo registro no se insertará la segunda vez.
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 prefiero 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 identificadores de usuario y para esos identificadores de usuario necesito actualizar el base_id 999 y 88 respectivamente. Esto funciona para mí.
tal vez alguien será ú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 nuevo (2 en uno)