2012-02-13 59 views
6

Tengo una tabla con 3 columnas. Cada uno tiene un índice único.inserción múltiple de MySQL cuando no se permiten duplicados.

Me gustaría hacer varias inserciones a la vez (300 registros a la vez). Cuando se produce una entrada duplicada, cancela la inserción en su totalidad. Esto significa que si 1 de los 300 es un duplicado, ninguno de ellos será insertado.

¿Hay alguna forma de evitar esto?

Respuesta

8

Intente cambiar su consulta de INSERT INTO ... a INSERT IGNORE INTO .... Esto hará que los errores se conviertan en advertencias, y sus otros registros deberían insertarse.

+0

Gracias, fui por esto. Parece estar funcionando bien. – Steve

0

Uso de una transacción: http://dev.mysql.com/doc/refman/5.0/en/commit.html

START TRANSACTION // DO QUERIES COMMIT

Si algo va mal en realizar consultas, se va a cometer ninguno de los registros.

Si desea ignorar los errores. use --force desde su línea de comando mysql

+0

Creo que el OP quiere lo contrario ... está haciendo una inserción múltiple y toda la sentencia de inserción está muriendo debido a un mal registro. –

+0

He actualizado mi respuesta para reflejar esto. –

1

Si sus inserciones son idempotentes, update or replace lo ayudaría.

Dado que es probable que no, no hay una manera super eficiente de hacer esto sin que algo caiga nuevamente a la inserción de filas individuales como una alternativa: aislar la fila del problema.

Si está insertando en lotes inserciones para reducir la latencia de cliente a servidor, considere usar un stored procedure para tomar las filas, y lo inserta en el servidor tomando todos los datos en una toma; que puede tener un respaldo que maneja el error de forma adecuada fila por fila.

Eso supone, por supuesto, que hay un cierto manejo de errores significativo que se puede hacer en el lado del servidor sin necesidad de comunicación síncrona con el cliente.

0

se puede usar algo como esto:

INSERT INTO table (username, id) 
      VALUES 
      ('john', 1), 
      ('jim', 2), 
      ('mary', 3), 
      ('jack', 4), 
      ('helen', 4) ON DUPLICATE KEY IGNORE 

Si desea que la entrada a sustituir, en lugar de utilizar la actualización IGNORE.

+0

MySQL no tiene un 'EN DUPLICATE KEY IGNORE'. Solo es compatible con 'ON DUPLICATE KEY UPDATE'. –

Cuestiones relacionadas