我正在尝试执行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 :(得分: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