Mysql 2插入查询

时间:2016-02-22 19:03:35

标签: mysql jdbc

我正在尝试执行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()这意味着如果第一个查询刚更新了数据,我将在第二个查询中使用不正确的行。

所以,我想知道如何同步这两个查询。

1 个答案:

答案 0 :(得分: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作为键(尽管我坚持使用{{ 1}}):

id