Объединение двух операторов SQL в один, чтобы обновить строку в таблице, если она удовлетворяет определенным условиям - PullRequest
0 голосов
/ 16 апреля 2020

Я работаю над приложением, использующим JDB C для обновления запасов и размещения заказа.

Я храню продукты и хочу обновить продукты, если запрошенное количество меньше сохраненного, и я хочу удалить продукт из базы данных, если количество равно количеству текущего запаса в БД.

Я использую два разных утверждения, но я хотел бы использовать только одно из них. Например, если я хочу добавить заказ в БД, то вещи, которые будут запрашиваться системой, - это имя и количество продукта. Количество продукта будет вычтено из общего количества продукта в БД. Псевдокод будет иметь вид

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=?

Я хотел бы объединить их, если это возможно,

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Один из способов - это ослабить безопасность, установив MySQL Свойство конфигурации allowMultiQueries в true в URL-адресе соединения.

Затем вы можете выполнить два оператора 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);
}
0 голосов
/ 16 апреля 2020

В производственной системе вы будете делать такие вещи.

Для заказа, как вы сказали, сделайте это.

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

Затем, в течение ночи или еженедельной уборки, сделайте это, чтобы избавиться от рядов без остатка.

DELETE FROM products WHERE quantity = 0

Когда вы хотите узнать, какие продукты действительно доступны, вы делаете

SELECT product_name, quantity FROM products WHERE quantity > 0

Идея здесь: строки с нулевым количеством «невидимы», даже если они не удалены.

Если бы это была моя система, я бы НЕ УДАЛЯЛ строки. С одной стороны, что происходит, когда вы получаете больше товаров на складе?

...