Загрузка данных
-- =====================================================
-- Задания 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;