2016-02-22 190 views
1

我想執行2個查詢。Mysql 2插入查詢

第一個應該插入數據(特別是「產品」)或更新,以防數據庫已經有這樣的標題行。

第二個要插入新類別產品,插入\從第一次查詢更新,並忽略任何插入,如果表中已經有這樣的產品,這樣的分類

這裏是我的代碼:

conn = DatabaseConnection.getConnection(); 
stmt = conn.createStatement(); 
conn.setAutoCommit(false); 

String updateSQL = "INSERT INTO product (title, price, `status`) " + 
       "VALUES(?, ?, ?)" + 
       "ON DUPLICATE KEY UPDATE price = ?, `status` = ?;" 

PreparedStatement preparedStatement = conn.prepareStatement(updateSQL); 
preparedStatement.setString(1, product.getTitle()); 
preparedStatement.setBigDecimal(2, product.getPrice()); 
preparedStatement.setInt(3, product.getStatus().ordinal()); 
preparedStatement.executeUpdate(); 

updateSQL = "INSERT IGNORE INTO product_categories (product_id, category_id) " + 
      "VALUES (last_insert_id(), ?);"; 
preparedStatement = conn.prepareStatement(updateSQL); 
preparedStatement.setLong(1, categoryId); 
preparedStatement.executeUpdate(); 
conn.commit(); 

所以,問題是我使用last_insert_id()這意味着如果第一個查詢只更新了數據,我將在第二個查詢中使用不正確的行。

所以,我想知道如何同步這兩個查詢。

+0

葉氏,我只是忘了複製。 我不明白什麼是「取」 「[看這個問題的細節]」只是一個字符串,它不是一個鏈接 – quento

+0

(對不起 - 忘了粘貼鏈接)從你的第一個查詢中取出last_insert_id,如果它存在,只執行第二個查詢。 [請參閱此問題的詳細信息](http://stackoverflow.com/questions/5513180/java-preparedstatement-retrieving-last-inserted-id) – Kenney

+0

您能提供一個示例嗎? – quento

回答

1

由於您無權在第二個查詢中訪問last_insert_id(),因此您必須取回as in the answers for this question

下面是一個例子:

... 
preparedStatement.executeUpdate(); // this is the first query 

ResultSet rs = preparedStatement.getGeneratedKeys(); 
if (rs.next()) 
{ 
    long last_insert_id = rs.getLong(1); 

    updateSQL = "INSERT IGNORE INTO product_categories (product_id, category_id) " + 
      "VALUES (?, ?);"; 
    preparedStatement = conn.prepareStatement(updateSQL); 
    preparedStatement.setLong(1, last_insert_id); 
    preparedStatement.setLong(2, categoryId); 
    preparedStatement.executeUpdate(); 
} 
conn.commit(); 

如果第一次查詢沒有導致INSERT,則沒有足夠的信息給產品添加到PRODUCT_CATEGORY,在這種情況下,這是跳過所有在一起。這確實假定該產品已經在該類別中。如果你不知道這一點,並希望無論執行第二查詢,可以查詢的PRODUCT_ID:

SELECT id FROM product WHERE title = ? 

然後使用該id代替last_insert_id變量,或者,你可以改變第二查詢,並使用title作爲重點(雖然我有id棒):

INSERT IGNORE INTO product_categories (product_id, category_id) 
VALUES (SELECT id FROM product WHERE title = ?), ?) 
+0

謝謝,我已經提供了這個解決方案!) – quento