2012-05-28 14 views
9

Tengo algunos equipos en red que están conectados a múltiples redes/VLans (A, B & C) y otros equipos que solo están conectados a una de las redes. Cuando elimino o reemplazo una red, necesito actualizar mi base de datos para reflejar a qué está conectado el equipo, así que estoy tratando de escribir una declaración de mysql para hacerlo, pero me estoy encontrando con varios bloqueos.¿Es posible fusionar dos registros utilizando la instrucción "eliminar de"?

Mi tabla solo tiene dos campos y no puede haber registros duplicados. Mi ejemplo de datos es

deviceID network 
1  A 
1  B 
1  C 
2  B 
2  C 
3  A 
4  A 
5  B 

Cómo puedo combinar la red A en la red B por lo que la tabla anterior se vería así ...

deviceID network 
1  B 
1  C 
2  B 
2  C 
3  B 
4  B 
5  B 

mi intento inicial era simplemente set network = 'B' where network = 'A', seguido de un estado DELETE network 'A' pero eso crearía duplicados, lo cual no está permitido para esa tabla, aunque los duplicados serían breves. Usando métodos alternativos, sigo corriendo en las declaraciones de mysql fallidas usando WHERE EXISTS y varias declaraciones FROM (SELECT). ¿Es posible hacerlo en una sola instrucción mysql? ¿Necesito dos?

Cualquier ayuda es apreciada.

Respuesta

10

Usted podría utilizar UPDATE IGNORE con su instrucción de actualización - esto sería omitir las actualizaciones que causaron duplicados. A continuación, debe seguir esto con DELETE para borrar las filas que se saltaron. Por ejemplo:

UPDATE IGNORE mytable SET network = 'B' WHERE network = 'A'; 
DELETE FROM mytable WHERE network = 'A'; 

Desde el documentation:

Con la palabra clave IGNORE, la instrucción de actualización no aborta incluso si se producen errores durante la actualización. Las filas para las que se producen conflictos de clave duplicada no se actualizan. Las filas para las que las columnas se actualizan a los valores que causarían errores de conversión de datos se actualizan en su lugar a los valores válidos más cercanos.

+0

Esto funcionó perfectamente, ¡Gracias! – JonDoeCA

5

En lugar de tener dos columnas, se puede considerar que sí tres columnas como
(la clave única se mantienen sin cambios)

  • deviceID
  • red
  • estado (1,0)

por lo tanto, siempre que se haya eliminado/reemplazado un dispositivo,
, marque el estado en 0,
por supuesto, retrive la lista correcta, se requiere status=1

+0

Jugué con el uso de este método, y lo he usado en el pasado, pero esperaba evitarlo esta vez. No quería tener que hacer modificaciones en mis otras páginas/código para adaptarme a la nueva forma de manejar la nueva estructura de la tabla. ¡Gracias por la respuesta! – JonDoeCA

Cuestiones relacionadas