Загрузка данных


-- =====================================================
-- Задания 1–28 по работе с БД поставок
-- =====================================================

-- 1. Добавить нового поставщика ООО Север с телефоном +49 160 1002003.
INSERT INTO supplier (name, phone) VALUES ('ООО Север', '+49 160 1002003');

-- 2. Добавить нового поставщика GmbH West с телефоном +49 151 3004005.
INSERT INTO supplier (name, phone) VALUES ('GmbH West', '+49 151 3004005');

-- 3. Добавить товар Кабель USB-C 1м с ценой 3.90 и остатком 40.
INSERT INTO product (name, price, quantity_in_stock, unit) 
VALUES ('Кабель USB-C 1м', 3.90, 40, 'шт');

-- 4. Добавить товар Мышь беспроводная с ценой 12.50 и остатком 15.
INSERT INTO product (name, price, quantity_in_stock, unit) 
VALUES ('Мышь беспроводная', 12.50, 15, 'шт');

-- 5. Добавить товар Клавиатура с ценой 19.90 и остатком 10.
INSERT INTO product (name, price, quantity_in_stock, unit) 
VALUES ('Клавиатура', 19.90, 10, 'шт');

-- 6. Добавить товар Флешка 64GB с ценой 8.40 и остатком 25.
INSERT INTO product (name, price, quantity_in_stock, unit) 
VALUES ('Флешка 64GB', 8.40, 25, 'шт');

-- 7. Добавить товар Зарядка 20W с ценой 14.00 и остатком 12.
INSERT INTO product (name, price, quantity_in_stock, unit) 
VALUES ('Зарядка 20W', 14.00, 12, 'шт');

-- 8. Оформить поставку на сегодня для поставщика ООО Север.
INSERT INTO delivery (supplier_id, delivery_date, document_number, status)
VALUES (
    (SELECT supplier_id FROM supplier WHERE name = 'ООО Север'),
    DATE('now'),
    'DEL-001',
    'created'
);

-- 9. В созданную поставку добавить 30 шт товара Кабель USB-C 1м.
INSERT INTO delivery_item (delivery_id, product_id, quantity, purchase_price)
VALUES (
    (SELECT delivery_id FROM delivery WHERE document_number = 'DEL-001'),
    (SELECT product_id FROM product WHERE name = 'Кабель USB-C 1м'),
    30,
    (SELECT price FROM product WHERE name = 'Кабель USB-C 1м')
);

-- 10. В созданную поставку добавить 10 шт товара Флешка 64GB.
INSERT INTO delivery_item (delivery_id, product_id, quantity, purchase_price)
VALUES (
    (SELECT delivery_id FROM delivery WHERE document_number = 'DEL-001'),
    (SELECT product_id FROM product WHERE name = 'Флешка 64GB'),
    10,
    (SELECT price FROM product WHERE name = 'Флешка 64GB')
);

-- 11. В созданную поставку добавить 5 шт товара Зарядка 20W.
INSERT INTO delivery_item (delivery_id, product_id, quantity, purchase_price)
VALUES (
    (SELECT delivery_id FROM delivery WHERE document_number = 'DEL-001'),
    (SELECT product_id FROM product WHERE name = 'Зарядка 20W'),
    5,
    (SELECT price FROM product WHERE name = 'Зарядка 20W')
);

-- 12. Провести приход по этой поставке: увеличить остатки товаров по данным позиций поставки.
UPDATE product SET quantity_in_stock = quantity_in_stock + (
    SELECT di.quantity FROM delivery_item di 
    WHERE di.product_id = product.product_id AND di.delivery_id = (SELECT delivery_id FROM delivery WHERE document_number = 'DEL-001')
);
UPDATE delivery SET status = 'received' WHERE document_number = 'DEL-001';

-- 13. Оформить поставку на сегодня для поставщика GmbH West.
INSERT INTO delivery (supplier_id, delivery_date, document_number, status)
VALUES (
    (SELECT supplier_id FROM supplier WHERE name = 'GmbH West'),
    DATE('now'),
    'DEL-002',
    'created'
);

-- 14. В поставку GmbH West добавить 7 шт товара Мышь беспроводная.
INSERT INTO delivery_item (delivery_id, product_id, quantity, purchase_price)
VALUES (
    (SELECT delivery_id FROM delivery WHERE document_number = 'DEL-002'),
    (SELECT product_id FROM product WHERE name = 'Мышь беспроводная'),
    7,
    (SELECT price FROM product WHERE name = 'Мышь беспроводная')
);

-- 15. В поставку GmbH West добавить 6 шт товара Клавиатура.
INSERT INTO delivery_item (delivery_id, product_id, quantity, purchase_price)
VALUES (
    (SELECT delivery_id FROM delivery WHERE document_number = 'DEL-002'),
    (SELECT product_id FROM product WHERE name = 'Клавиатура'),
    6,
    (SELECT price FROM product WHERE name = 'Клавиатура')
);

-- 16. Провести приход по поставке GmbH West: обновить остатки товаров.
UPDATE product SET quantity_in_stock = quantity_in_stock + (
    SELECT di.quantity FROM delivery_item di 
    WHERE di.product_id = product.product_id AND di.delivery_id = (SELECT delivery_id FROM delivery WHERE document_number = 'DEL-002')
);
UPDATE delivery SET status = 'received' WHERE document_number = 'DEL-002';

-- 17. Исправить цену товара Флешка 64GB на 7.90.
UPDATE product SET price = 7.90 WHERE name = 'Флешка 64GB';

-- 18. Увеличить цену всех товаров дешевле 5.00 на 0.50.
UPDATE product SET price = price + 0.50 WHERE price < 5.00;

-- 19. Уменьшить остаток товара Зарядка 20W на 2 (возврат/списание).
UPDATE product SET quantity_in_stock = quantity_in_stock - 2 WHERE name = 'Зарядка 20W';

-- 20. Установить остаток товара Клавиатура ровно 8 (по инвентаризации).
UPDATE product SET quantity_in_stock = 8 WHERE name = 'Клавиатура';

-- 21. Исправить количество Кабель USB-C 1м в последней поставке ООО Север с 30 на 25.
UPDATE delivery_item 
SET quantity = 25 
WHERE product_id = (SELECT product_id FROM product WHERE name = 'Кабель USB-C 1м')
AND delivery_id = (SELECT delivery_id FROM delivery WHERE supplier_id = (SELECT supplier_id FROM supplier WHERE name = 'ООО Север') ORDER BY delivery_id DESC LIMIT 1);

-- 22. После исправления количества пересчитать остаток товара Кабель USB-C 1м корректно.
-- Сначала возвращаем старый приход, затем применяем новый
UPDATE product 
SET quantity_in_stock = quantity_in_stock - 30 + 25 
WHERE name = 'Кабель USB-C 1м';

-- 23. Удалить ошибочно созданную позицию поставки Зарядка 20W в поставке ООО Север.
DELETE FROM delivery_item 
WHERE product_id = (SELECT product_id FROM product WHERE name = 'Зарядка 20W')
AND delivery_id = (SELECT delivery_id FROM delivery WHERE supplier_id = (SELECT supplier_id FROM supplier WHERE name = 'ООО Север') ORDER BY delivery_id DESC LIMIT 1);

-- 24. После удаления позиции откатить остаток товара Зарядка 20W на количество удалённой позиции.
UPDATE product 
SET quantity_in_stock = quantity_in_stock - 5 
WHERE name = 'Зарядка 20W';

-- 25. Попробовать добавить позицию поставки с несуществующим product_id и зафиксировать ошибку внешнего ключа.
-- Этот запрос вызовет ошибку FOREIGN KEY constraint failed
INSERT INTO delivery_item (delivery_id, product_id, quantity, purchase_price)
VALUES (1, 99999, 10, 100);
-- Фиксация ошибки: сообщение "FOREIGN KEY constraint failed"

-- 26. Попробовать добавить товар с отрицательной ценой и зафиксировать ошибку CHECK.
-- Этот запрос вызовет ошибку CHECK constraint failed: chk_product_price
INSERT INTO product (name, price, quantity_in_stock) VALUES ('Тестовый товар', -10, 100);
-- Фиксация ошибки: сообщение "CHECK constraint failed: chk_product_price"

-- 27. Выполнить серию обновлений в транзакции и затем отменить изменения через ROLLBACK.
BEGIN TRANSACTION;
    UPDATE product SET price = price * 1.1 WHERE category IS NULL;
    UPDATE product SET quantity_in_stock = quantity_in_stock + 100 WHERE product_id = 1;
    DELETE FROM delivery_item WHERE quantity < 0;
ROLLBACK;
-- После ROLLBACK все изменения отменены, данные остались как до транзакции

-- 28. Вывести отчёт: товары (название, цена, остаток), отсортировать по остатку по возрастанию и показать 3 товара с минимальным остатком.
SELECT name, price, quantity_in_stock 
FROM product 
ORDER BY quantity_in_stock ASC 
LIMIT 3;