Estoy tratando de insertar una nueva fila, pero si la clave ya existe, quiero actualizar la fila SOLAMENTE si un cierto otro valor está en la tabla es diferente. ¿Es esto posible en una consulta/enunciado mysql?condicional en la actualización de clave duplicada
Mi mesa consisten en las siguientes columnas: gorro, guantes, nombre, last_update
sombrero + manoplas componen el índice único (dicen que los valores de "sombrero" y "manoplas" son colores)
vamos a suponer que esto ya está en la tabla:
1. hat=blue mittens=green name=george last_update=tuesday 2. hat=red mittens=green name=bill last_update=monday
en un duplicado de la llave, quiero insertar como de costumbre. En la clave duplicada, quiero hacer una actualización SÓLO SI el nombre cambia; de lo contrario, ignórelo. La razón para esto es que quiero conservar el valor last_update (timestamp).
hat=yellow mittens=purple name=jimmy -- insert new row hat=blue mittens=green name=george -- ignore hat=blue mittens=green name=betty -- update row
¿Es esto posible sin el uso de declaraciones por separado para mirar por primera vez la fila existente, comparar los valores y luego emitir una actualización si es necesario? Si es así, ¿cuál sería la sintaxis?
Gracias por su respuesta. Intenté todos. De hecho, el uso de una simple instrucción UPDATE como
update tbl set name='george' where hat='blue' and mittens='green'
no genera filas actualizadas. Sin embargo, utilizando
INSERT INTO tbl (hat,mittens,name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name='george';
o
INSERT INTO tbl (hat, mittens, name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name=CASE WHEN name <> VALUES(name) THEN VALUES(name) ELSE name END;
alguna manera da lugar a la fila que se está actualizado (y la fecha haya cambiado).
Fwiw, esta es la tabla que estoy usando:
CREATE TABLE `tbl` (
`hat` varchar(11) default NULL,
`mittens` varchar(11) default NULL,
`name` varchar(11) default NULL,
`stamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
UNIQUE KEY `clothes` (`hat`,`mittens`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
MySQL es la versión 4.1.22 (tal vez esto importa?) Una vez más, mi agradecimiento por todas las respuestas.
yo supongo que es su versión de MySQL, que es el problema aquí. Parece que arreglaron un error (http://bugs.mysql.com/bug.php?id=28904) con INSERTAR ... EN ACTUALIZACIÓN DUPLICADA DE LLAVE en la bifurcación 5.0, después de finalizar el soporte activo para la rama 4.1 (Dic. 31 de diciembre de 2006). He vuelto a crear tu tabla y tu caso de prueba en mi máquina y funcionó como se esperaba, y estoy ejecutando MySQL Server 5.0.67. Si no puede actualizar su instalación de MySQL, entonces puede estar atascado sin una solución de 'sola consulta' a su problema. – zombat
CONFIRMADO. Ambas soluciones funcionan en 5.0.45 (desafortunadamente, eso es solo un servidor de desarrollo). ¡Gracias de nuevo! – javalina
¿Has probado la segunda de las dos consultas que sugerí?¿El que controló manualmente lo que sucedió con la columna de sello (last_update)? Creo que uno debería funcionar aunque exista esa falla, ya que explícitamente decide si actualizar la columna o no con otra declaración de caso. – Dipin