2010-06-14 11 views
7

Aquí está mi mesa con algunos datos de ejemploMySQL INSERT no haga caso de trabajar

a_id | b_id 
------------ 
    1 225 
    2 494 
    3 589 

Cuando ejecuto esta consulta

INSERT IGNORE INTO table_name (a_id, b_id) VALUES ('4', '230') ('2', '494') 

Inserta ambas filas cuando se supone hacer caso omiso de la segunda pareja de valores (2, 494)

No hay índices definidos, ninguna de estas columnas son primarios.

¿Qué no sé?

Respuesta

13

Desde el docs:

Si utiliza la palabra clave IGNORE, los errores que se producen durante la ejecución de la sentencia INSERT se tratan como advertencias en su lugar. Por ejemplo, sin IGNORE, una fila que duplica un índice UNIQUE existente o el valor PRIMARY KEY en la tabla provoca un error de clave duplicada y la instrucción se cancela. Con IGNORE, la fila aún no está insertada, pero no se emite ningún error.

(la cursiva es mía).

Su fila no está duplicando "un índice UNIQUE existente o valor PRIMARY KEY" ya que no tiene ninguna clave principal ni ninguna restricción única.


Si, como usted menciona en uno de sus comentarios, que desea ninguno de los campos a ser único, pero que hace quieren que la combinación sea único, es necesaria una clave primaria compuesta a través de ambas columnas (deshacerse de cualquier duplicado primeros):

alter table MYTABLE add primary key (a_id,b_id) 
1

si no hay una clave principal, no puede haber duplicado de la llave de ignorar. siempre debe establecer una clave primaria, para que lo haga, y si desea tener columnas adicionales que no deberían duplicarse, configúrelas como "únicas".

+0

Hmm ... entonces, ¿cómo puedo ignorar una fila duplicada sin la necesidad de una clave principal? Y no quiero establecer una columna en particular como única. Quiero que la combinación de ambas columnas sea única. Por ejemplo, puede haber una fila (3, 589) y una fila (3, 330) pero no puede haber dos (3, 589) s – HyderA

+0

Debe usar una restricción única de varias columnas. Ejemplo ya proporcionado por paxdiablo. Esto cumplirá con su requisito.DEBE tener una restricción única si desea que MySQL maneje su solicitud IGNORE. – Fenton

3

Si no pone un criterio UNIQUE o establece un PRIMARY KEY, MySql no sabrá que su nueva entrada es un duplicado.

0

Si he entendido bien, después de ejecutar el comando insert su mesa se parece a esto

1 225 
2 494 
3 589 
4 230 
2 494 

De ser así, la respuesta es porque el diseño de su mesa permite duplicados.

Si lo desea evitar que el segundo disco se inserte, que necesita para definir la columna A_ID como una clave principal o un índice único. Si lo hace, la instrucción de inserción de ignorar funcionará como usted espera, es decir, inserte los registros, ignore los errores tales como intentar agregar un registro duplicado.