2012-03-30 8 views
9

scenerio:MySQL Jak pobrać identyfikator LAST_INSERT_ID podczas korzystania z INSERT IGNORE INTO?

  1. ja wkładając plik CSV do mojej bazy danych.
  2. Używam jdbc sterownik do iteracyjne nad plikiem i zrobić MY wstawia
  3. Kolumna name składa unique więc wkładki nie zmieniają stolik, kiedy sama wartość przybywa
  4. Używam INSERT INTO IGNORE aby utrzymać iteracja pękaniu gdy zdarzenie
  5. używam LAST_INSERT_ID(), aby dodać FK w następnej tabeli wkładki
  6. otrzymuję 0 gdy INSERT_IGNORE dzieje

Jak to naprawić?

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(); 
     } 
    } 

Przykład pliku CSV do umieszczenia w bazie danych

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

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

+0

Wha t jest problem, który próbujesz naprawić? Jeśli robisz "INSERT IGNORE" i następuje ignorowanie, nie ma wkładki, więc nie istnieje Last_insert_id dla tej transakcji. Jeśli chcesz mieć poprzedni ostatni identyfikator wstawki, musisz go przechwycić zaraz po tej wstawce. Ale jeśli chodzi o ostatnią próbę wstawienia, to jeśli to się nie stanie, last_insert_id będzie 0. –

+0

@DMac, a następnie, jak mogę wstawić do bazy danych, gdy nie chcesz zastąpić istniejącej kolumny, gdy już istnieje? – stackoverflow

+0

@ Stackoverflow Wysłałem odpowiedź poniżej, która pasuje do mysql. –

Odpowiedz

2

Jeśli chcesz uzyskać identyfikator dla kolejnej wkładki, kod musi przetestuj wartość 0 LAST_INSERT_ID i jeśli ją uzyska, zrób SELECT w tabeli, aby znaleźć właściwą wartość dla FK dla wstawki.

W pseudo-kodu, będzie to wyglądać tak:

$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)") 

Będziesz musiał tłumaczyć, że do własnej aplikacji i języka.

+0

Oto moja struktura tabeli http://sqlfiddle.com/#!2/b5752, a podam przykład pliku csv w powyższej edycji. – stackoverflow

5

Czy znasz składnię MySQL o 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)"); 

praktyczny przykład tutaj udziałem utrzymanie nieudanych adresów e-mail dla witryny:

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

chodzi o zdobycie ostatni zapisany identyfikator jest pobierana z mysql po .com link powyżej:

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

To powinna być na pewno akceptowana odpowiedź. Działa perfekcyjnie i oszczędza dużo logiki wymaganej w inny sposób, na przykład, która została dostarczona w zaakceptowanej odpowiedzi. – teh1