mysql - multiple - on duplicate key update php
¿Hay alguna manera de utilizar ON DUPLICATE KEY para actualizar todo lo que quería insertar? (3)
Sé que puede usar ON DUPLICATE KEY UPDATE
para actualizar un cierto valor si ya hay un registro para esa clave,
Puedo hacer esto:
INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE `a`=1, `b`=2, `c`=3
Pero, ¿cómo puedo hacer esto sin tener que escribir las columnas y los valores dos veces?
Puede llegar a mitad de camino sin tener que repetir el valor:
INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`);
Pero aún tienes que listar las columnas.
Si es útil, realicé una consulta para evitar escribir a mano la última parte de la consulta "en duplicado", para versiones> = 5.0:
SELECT GROUP_CONCAT( CONCAT(COLUMN_NAME,"=values(", COLUMN_NAME,")") SEPARATOR ", ") FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ''database_name'' AND TABLE_NAME = ''table_name'';
y su salida es esta:
a=values(a), b=values(b), c=values(c), d=values(d)
en una tabla que tiene las columnas a, b, c y d, por lo que puede agregar a la primera parte de la consulta:
INSERT INTO `tableName` (`a`,`b`,`c`, `d`) VALUES (1,2,3,4) ON DUPLICATE KEY UPDATE a=values(a), b=values(b), c=values(c), d=values(d)
ACTUALIZACIÓN: para una lista muy larga de columnas, puede ver un resultado truncado, puede usar esta declaración antes de la consulta anterior (gracias Tío iroh ):
SET SESSION group_concat_max_len = 1000000;
utilizar REPLACE INTO
El significado de REPLACE INTO
es que SI el nuevo registro presenta nuevos valores clave, se insertará como un nuevo registro.
SI el nuevo registro tiene valores clave que coinciden con un registro preexistente, se ignorará la violación de la clave y el nuevo registro reemplazará el registro preexistente.