2011-09-21 28 views
35

Estoy insertando algunas palabras en una tabla de dos columnas con este comando:¿Cómo obtengo la ID de varias filas insertadas en MySQL?

INSERT IGNORE INTO terms (term) VALUES ('word1'), ('word2'), ('word3'); 
  1. ¿Cómo puedo obtener el ID (clave principal) de la fila en la que se inserta cada palabra. Me refiero a devolver un valor como "55,56,57" después de ejecutar INSERT. ¿MySQL tiene tal respuesta?

  2. El término columna es UNIQUE. Si un término ya existe, MySQL no lo insertará. ¿Es posible devolver la referencia para esta duplicación (es decir, el ID de la fila en la que existe el término)? Una respuesta como "55, , 56".

Respuesta

35
  1. Usted lo consigue a través de SELECT LAST_INSERT_ID(); o por medio de tener su marco/biblioteca de MySQL (en cualquier idioma) llamar mysql_insert_id().

  2. Eso no funcionará. Allí tiene que consultar los ID después de insertarlos.

+5

1. Eso no funcionará para una inserción de varias filas como muestra el OP. – ceejayoz

+0

+1 para la respuesta correcta. : D – brenjt

+2

Derecha - no en uno con 'INSERT IGNORE'. Pero en uno que no es 'IGNORE', le da el primer valor generado e insertado. – glglgl

3

¿Por qué no:

SELECT ID 
    FROM terms 
WHERE term IN ('word1', 'word2', 'word3') 
+0

Eso buscaría los términos que se insertaron previamente, y sería vulnerable a una condición de carrera en la que algo más inserte registros antes de que se active la consulta de selección. – ceejayoz

+2

?? término tiene una condición ÚNICA. Lo único que podría afectar a SELECT en una condición de carrera es DELETE, no otro INSERT. Y de acuerdo con (2) en la publicación de OP, quieren que se incluyan los ID de los registros insertados previamente. – mellamokb

+0

Eso es lo que tenía en mente; pero necesita pocas líneas de codificación. Además de SELECT, necesito buscar los resultados y ponerlos en un ciclo while (en php que uso). Espero encontrar algún tipo de respuesta mysql. – Googlebot

1

En primer lugar, para obtener el ID acaba de insertar, puede hacer algo como:

SELECT LAST_INSERT_ID() ; 

Cuidado, esto va a funcionar sólo después de su última INSERT consulta y devolverá el primer ID única si tienes una inserción múltiple

Luego, con la opción IGNORE, no creo que sea posible obtener las líneas que no se insertaron. Cuando haces un INSERT IGNORE, le dices a MySQL que ignore las líneas que tendrían que crear una entrada duplicada.

Si no coloca esta opción, el INSERT se detendrá y tendrá la línea afectada por la duplicación.

+0

Incluso sin IGNORE, solo funcionará para INSERT de una sola fila. Mi comando es una fila múltiple INSERT – Googlebot

+0

Solo la primera parte de mi respuesta incluía IGNORE. –

+1

Si está usando PHP, puede almacenar los ID en una tabla usando un bucle con un solo INSERT en cada pasaje. –

Cuestiones relacionadas