2010-03-02 14 views
118

Chicos Estoy tratando de terminar esta consulta -> mi campo de etiqueta está establecido en ÚNICA y simplemente quiero que la base de datos ignore cualquier etiqueta duplicada.¿Ha olvidado la clave duplicada?

INSERT INTO table_tags (tag) VALUES ('tag_a'),('tab_b'),('tag_c') 
ON DUPLICATE KEY IGNORE '*the offending tag and carry on*' 

o incluso esto sería aceptable

INSERT INTO table_tags (tag) VALUES ('tag_a'),('tab_b'),('tag_c') 
ON DUPLICATE KEY UPDATE '*the offending tag and carry on*' 
+0

Véase también : ["INSERT IGNORE" frente a "INSERT ... ON DUPLICATE KEY UPDATE"] (http://stackoverflow.com/q/548541/1402846). – Pang

Respuesta

270

sugeriría que no usar INSERTAR IGNORAR ya que ignora TODOS los errores (es decir, es un ignorado global descuidado). En su lugar, ya que en el ejemplo tag es la clave única, utilice:

INSERT INTO table_tags (tag) VALUES ('tag_a'),('tab_b'),('tag_c') ON DUPLICATE KEY UPDATE tag=tag; 

en la llave duplicada produce:

Query OK, 0 filas afectadas (0,07 seg)

+3

Bien, buena respuesta. ¡INSERTAR IGNORAR es una mala noticia! – Boundless

+1

@Derrick ¿consideraría cambiar la respuesta aceptada a esta para futuros buscadores? Sería mejor tener la solución más segura como la aceptada para aquellos que hacen referencia a esta misma pregunta. – damianb

+1

@Boundless Realmente no depende, por ejemplo, tengo una tabla que contiene categorías para una entrada de datos en particular en la base de datos. En cuanto a los cambios en estas categorías, utilizaría un INSERTAR IGNORAR que contenga todas estas categorías en lugar de las pruebas para ver las diferencias entre estas categorías. – Jay

11

MySQL tiene este práctico mando UPDATE INTO;)

edición parece que se le cambió el nombre a REPLACE

obras REEMPLAZAR exactamente como INSERT, excepto th en el caso de una vieja fila de la tabla tiene el mismo valor que una nueva fila para una PRIMARY KEY o un índice UNIQUE, la fila de edad se elimina antes de la nueva fila se inserta

+0

¿Necesito que vayas a elaborar sobre eso? –

+0

Gracias por su ayuda y tiempo, la solución Ivan Nevostruev parece ser la solución para mí –

+44

Reemplazar eliminará las filas en conflicto antes de reemplazarlas. Si tiene claves externas, apuntando a las filas eliminadas, tiene problemas. – nakhli

Cuestiones relacionadas