2012-03-30 13 views
9

Scenerio:MySQL ¿Cómo recupero el ID de LAST_INSERT_ID cuando uso INSERT IGNORE INTO?

  1. estoy insertando un archivo CVS en mi base de datos.
  2. estoy usando controlador JDBC para iterar sobre el archivo y hacer las inserciones mis
  3. name Una columna está hecha de modo unique insertos no cambian la mesa cuando llega
  4. mismo valor
  5. estoy usando INSERT INTO IGNORE para mantener el iteración se rompa al evento ocurre
  6. estoy usando LAST_INSERT_ID() para añadir al FK en el siguiente cuadro de inserción
  7. consigo 0 cuando sucede INSERT_IGNORE

¿Cómo soluciono esto?

Connection con = null; 

    try 
    { 
     Class.forName("com.mysql.jdbc.Driver"); 
     con = DriverManager.getConnection(URL, USERNAME, PASSWORD); 
     con.setAutoCommit(false); 

     Statement s1 = (Statement) con.createStatement(); 
     s1.executeUpdate("INSERT IGNORE INTO ORIGIN (ORI_NAME) VALUES(\"" 
      + d.getOriginName() + "\")"); 

     Statement s2 = (Statement) con.createStatement(); 
     s2.executeUpdate("INSERT IGNORE INTO STOCK (ORI_ID,S_TITLE) VALUES (" 
      + "(SELECT ORI_ID FROM ORIGIN WHERE ORI_ID =LAST_INSERT_ID()),\"" 
      + d.getStockTitle() + "\")"); 

    } 

     con.commit(); 

    } 
    catch (Exception e) 
    { 
     if (con != null) 
     try 
     { 
      con.rollback(); 
     } 
     catch (SQLException e1) 
     { 
      e1.printStackTrace(); 
     } 

     e.printStackTrace(); 
    } 
    finally 
    { 
     if (con != null) 
     try 
     { 
      con.close(); 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

Ejemplo de archivo CSV que se insertará en la base de datos

US, P1, M, 200, 344 
US, P1, L, 233, 344 
US, P2, M, 444, 556 
MX, Q4, L, 656, 777 

Tablas: http://sqlfiddle.com/#!2/b5752

+0

Wha ¿Es el problema que estás tratando de solucionar? Si está haciendo "INSERTAR IGNORAR" y ocurre la ignorancia, no hay un inserto, por lo que no hay un Last_insert_id para esa transacción. Si quería la última identificación de inserción anterior, tenía que capturarla justo después de esa inserción. Pero para el intento de inserción más reciente, si no sucedió, last_insert_id será 0. –

+0

@DMac, entonces, ¿cómo puedo hacer una inserción en una base de datos cuando no desea reemplazar la columna existente cuando ya existe? – stackoverflow

+0

@stackoverflow He publicado una respuesta a continuación que se ajusta a mysql. –

Respuesta

2

Si desea obtener un ID para una inserción posterior, el código tiene que prueba por un valor de 0 de LAST_INSERT_ID y, si lo consigue, haz un SELECTO en la tabla para encontrar el valor correcto para el FK de tu inserción.

En pseudo-código, esto se vería así:

$err = mysql("insert ignore into mytable values ($x, $y)") 
if($err){ 
    do something for an error 
} 
$id = mysql("select last_insert_id()"); 
if($id == 0){ 
    $id = mysql("select id from othertable where condition is true for the record I want to reference in my insert"); 
    if($id == 0){ 
     do something for error 
    } 
} 
mysql("insert into othertable VALUES ($id, other stuff)") 

Vas a tener que traducir eso a su propia aplicación y el lenguaje.

+0

aquí está mi estructura de tabla http://sqlfiddle.com/#!2/b5752 y voy a proporcionar un ejemplo del archivo csv en la edición anterior – stackoverflow

5

¿Está familiarizado con la sintaxis de MySQL ON DUPLICATE KEY UPDATE?

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

// Results are the same as doing an update. 
// Note the way the PK can be used to avoid an IGNORE. 
s1.executeUpdate("INSERT INTO ORIGIN (ORI_NAME) VALUES(\"" 
      + d.getOriginName() + "\" ON DUPLICATE KEY UPDATE ORI_ID=ORI_ID)"); 

Un ejemplo practico aquí que implica el mantenimiento de direcciones de correo electrónico fallidas para un sitio:

http://blog.developpez.com/james-poulson/p10016/sql/ne-rien-modifier-en-cas-de-duplicate-key/

En cuanto a la recuperación de la última Identificación añade el siguiente se toma de la mysql .com enlace arriba:

Suppose that id is the AUTO_INCREMENT column. To make LAST_INSERT_ID() meaningful for updates, insert rows as follows: 

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3; 
+2

Esta debería ser la respuesta aceptada. Funciona perfectamente y ahorra una gran cantidad de lógica necesaria, por ejemplo, la que se proporcionó en la respuesta aceptada. – teh1

Cuestiones relacionadas