我有一個應用程序將大量數據記錄到MySQL數據庫。生產版本已經批量運行插入語句以提高性能。我們正在改變數據庫模式,以便將一些無關數據發送到我們可以加入查詢的不同表中。批量MySQL插入,一個主要記錄,一個具有外部密鑰的詳細記錄
但是,我試圖正確設計查詢以使用我們的批處理系統。我想使用mysql LAST_QUERY_ID
,所以我不必擔心獲取生成的密鑰並將它們匹配起來(看起來像一個非常困難的任務)。
但是,我似乎無法找到一種方法來添加不同的插入語句到一個批處理,所以如何解決這個問題?我假設我需要構建第二批並添加所有詳細查詢,但這意味着LAST_QUERY_ID失去意義。
s = conn.prepareStatement("INSERT INTO mytable (stuff) VALUES (?)");
while (!queue.isEmpty()){
s.setLong(1, System.currentTimeMillis()/1000L);
// ... set other data
s.addBatch();
// Add insert query for extra data if needed
if(a.getData() != null && !a.getData().isEmpty()){
s = conn.prepareStatement("INSERT INTO mytable_details (stuff_id,morestuff)
VALUES (LAST_INSERT_ID(),?)");
s.setString(1, a.getData());
s.addBatch();
}
}
你能再詳細一點嗎? 「你似乎無法找到方法」是什麼意思?上面的代碼是否會拋出異常呢? – hqcasanova
上面的代碼將不起作用,因爲語句被覆蓋。如果有第二個查詢的數據,第一個查詢就不會運行。我不能讓它的工作沒有第二個語句變量/批處理,但然後查詢將運行不順序和last_insert_id是無用的 – helion3
謝謝。我在下面添加了我的答案,但我不確定它是否會對您有所幫助。 – hqcasanova