合并两个SQL语句,如果满足特定条件,则更新表中的行

问题描述 投票:0回答:2

我正在使用JDBC更新库存和下订单的应用程序。

我正在存储产品,并且如果请求的数量少于所存储的数量,我想更新产品;如果数量等于数据库中的当前库存数量,我想从数据库中删除该产品。

我正在使用两个不同的语句,但是我只想使用其中之一。例如,如果我想向数据库中添加订单,则系统要请求的内容是名称和产品数量。产品数量将从DB上产品的总数量中减去。伪代码将是

IF product quantity - user quantity =0 THEN DELETE product FROM database

ELSE UPDATE product quantity TO product quantity-user quantity ON THE database

product quantity=quantity of the product in the database

user quantity=quantity requested by the user

我现在所准备的陈述是这两个

UPDATE products SET quantity=quantity-? WHERE product_name=?

DELETE FROM products WHERE product_name=?

如果可能,我想将它们合并为一个

java mysql sql jdbc
2个回答
0
投票

在生产系统中,您会做这种事情。

按照您的要求,执行此操作。

UPDATE products SET quantity=quantity-? WHERE product_name=?

然后,在隔夜或每周的清理中执行此操作以清除没有剩余数量的行。

DELETE FROM products WHERE quantity = 0

[当您想知道实际可用的产品时,您可以

SELECT product_name, quantity FROM products WHERE quantity > 0

这里的概念:数量为零的行即使不被删除也是“不可见的”。

如果这是我的系统,则不会删除行。一方面,当您获得更多库存产品时会发生什么?


0
投票

一种方法是通过在连接URL中将MySQLConfiguration PropertyallowMultiQueries设置为true来放宽安全性。

然后您可以一起执行两个SQL语句:

String sql = "UPDATE products" +
               " SET quantity = quantity - ?" +
             " WHERE product_name = ?" +
               " AND quantity >= ?" +
             ";" +
             "DELETE FROM products" +
             " WHERE product_name = ?" +
               " AND quantity = 0";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
    stmt.setInt(1, userQuantity);
    stmt.setString(2, productName);
    stmt.setInt(3, userQuantity);
    stmt.setString(4, productName);
    stmt.execute();
    int updateCount = stmt.getUpdateCount();
    if (updateCount == 0)
        throw new IllegalStateException("Product not available: " + productName);
    // if you need to know if product got sold out, do the following
    stmt.getMoreResults();
    int deleteCount = stmt.getUpdateCount();
    boolean soldOut = (deleteCount != 0);
}
© www.soinside.com 2019 - 2024. All rights reserved.