Scenerio:MySQL Làm cách nào để truy xuất ID của LAST_INSERT_ID khi sử dụng INSERT IGNORE INTO?
- Tôi đang chèn tệp CSV vào cơ sở dữ liệu của mình.
- Tôi đang sử dụng trình điều khiển JDBC để lặp qua các tập tin và thực hiện chèn của tôi
- Một cột
name
được làmunique
để chèn không thay đổi bảng khi cùng giá trị đến - Tôi đang sử dụng
INSERT INTO IGNORE
để giữ lặp từ phá vỡ khi sự kiện xảy ra - tôi đang sử dụng LAST_INSERT_ID() để thêm như FK trong bảng tiếp theo của chèn
- tôi nhận được 0 khi
INSERT_IGNORE
xảy ra
Làm cách nào để khắc phục sự cố này?
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();
}
}
Ví dụ về tập tin CSV để được chèn vào cơ sở dữ liệu
US, P1, M, 200, 344
US, P1, L, 233, 344
US, P2, M, 444, 556
MX, Q4, L, 656, 777
Bàn: http://sqlfiddle.com/#!2/b5752
Wha t là vấn đề bạn đang cố khắc phục? Nếu bạn đang làm "INSERT IGNORE" và bỏ qua xảy ra, không có một chèn để không có một Last_insert_id cho giao dịch đó. Nếu bạn muốn id chèn cuối cùng trước đó, bạn cần chụp nó ngay sau khi chèn. Nhưng đối với nỗ lực chèn gần đây nhất, nếu nó không xảy ra, last_insert_id sẽ là 0. –
@DMac thì làm thế nào để tôi chèn một chèn vào cơ sở dữ liệu khi bạn không muốn thay thế cột hiện tại khi nó đã tồn tại? – stackoverflow
@stackoverflow Tôi đã đăng một câu trả lời dưới đây phù hợp với mysql. –