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


CREATE DATABASE IF NOT EXISTS `electronics_shop`
    DEFAULT CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;
USE `electronics_shop`;

-- 2. СПРАВОЧНАЯ ТАБЛИЦА РОЛЕЙ ПОЛЬЗОВАТЕЛЕЙ (user_roles)
-- Вместо ENUM в users, будем хранить ID роли отсюда
CREATE TABLE IF NOT EXISTS `user_roles` (
    `id` TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(50) NOT NULL UNIQUE,
    `description` VARCHAR(255),
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- 3. ТАБЛИЦА ПОЛЬЗОВАТЕЛЕЙ (users)
CREATE TABLE IF NOT EXISTS `users` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `username` VARCHAR(50) NOT NULL UNIQUE,
    `email` VARCHAR(100) NOT NULL UNIQUE,
    `password_hash` VARCHAR(255) NOT NULL,
    `name` VARCHAR(100), -- Для доставки
    `phone` VARCHAR(20), -- Для доставки
    `role_id` TINYINT UNSIGNED NOT NULL DEFAULT 2, -- По умолчанию роль 'user'
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`role_id`) REFERENCES `user_roles`(`id`) ON DELETE RESTRICT
) ENGINE=InnoDB;

-- 4. СПРАВОЧНАЯ ТАБЛИЦА СТАТУСОВ ЗАКАЗА (order_statuses)
-- Вместо ENUM в orders, будем хранить ID статуса отсюда
CREATE TABLE IF NOT EXISTS `order_statuses` (
    `id` TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(50) NOT NULL UNIQUE,
    `description` VARCHAR(255),
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- 5. ТАБЛИЦА КАТЕГОРИЙ (categories)
CREATE TABLE IF NOT EXISTS `categories` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(100) NOT NULL UNIQUE,
    `image_url` VARCHAR(255),
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- 6. ТАБЛИЦА ТОВАРОВ (products)
CREATE TABLE IF NOT EXISTS `products` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `category_id` INT UNSIGNED NOT NULL,
    `name` VARCHAR(200) NOT NULL,
    `description` TEXT,
    `image_url` VARCHAR(255),
    `price` DECIMAL(10, 2) UNSIGNED NOT NULL,
    `stock_quantity` INT UNSIGNED DEFAULT 0,
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (`category_id`) REFERENCES `categories`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB;

-- 7. ТАБЛИЦА ЗАКАЗОВ (orders)
CREATE TABLE IF NOT EXISTS `orders` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `user_id` INT UNSIGNED NOT NULL,
    `status_id` TINYINT UNSIGNED NOT NULL DEFAULT 1, -- По умолчанию статус 'new'
    `total_price` DECIMAL(12, 2) UNSIGNED NOT NULL,
    `name` VARCHAR(100) NOT NULL, -- Данные клиента из формы оформления
    `phone` VARCHAR(20) NOT NULL,
    `address` TEXT NOT NULL,
    `comment` TEXT,
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
    FOREIGN KEY (`status_id`) REFERENCES `order_statuses`(`id`) ON DELETE RESTRICT
) ENGINE=InnoDB;

-- 8. ТАБЛИЦА СОДЕРЖИМОГО ЗАКАЗА (order_items)
CREATE TABLE IF NOT EXISTS `order_items` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `order_id` BIGINT UNSIGNED NOT NULL,
    `product_id` INT UNSIGNED NOT NULL,
    `quantity` INT UNSIGNED NOT NULL,
    `price_per_item` DECIMAL(10, 2) UNSIGNED NOT NULL, -- Цена на момент покупки
    FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE CASCADE,
    FOREIGN KEY (`product_id`) REFERENCES `products`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB;


-- 9. НАПОЛНЕНИЕ СПРАВОЧНЫХ ТАБЛИЦ И ДАННЫХ

-- Заполняем справочник ролей (user_roles)
INSERT INTO `user_roles` (`id`, `name`, `description`) VALUES
(1, 'admin', 'Администратор системы. Полный доступ.'),
(2, 'user', 'Зарегистрированный покупатель.');

-- Заполняем справочник статусов заказа (order_statuses)
INSERT INTO `order_statuses` (`id`, `name`, `description`) VALUES
(1, 'new', 'Заказ только что создан, ожидает обработки.'),
(2, 'processing', 'Заказ собирается на складе.'),
(3, 'shipped', 'Заказ передан в службу доставки.'),
(4, 'completed', 'Заказ успешно доставлен и закрыт.'),
(5, 'canceled', 'Заказ отменен клиентом или администратором.');


-- Добавляем категории
INSERT INTO `categories` (`id`, `name`, `image_url`) VALUES
(1, 'Мониторы', 'https://via.placeholder.com/200x150?text=Мониторы'),
(2, 'Мыши', 'https://via.placeholder.com/200x150?text=Мыши'),
(3, 'Клавиатуры', 'https://via.placeholder.com/200x150?text=Клавиатуры'),
(4, 'Наушники', 'https://via.placeholder.com/200x150?text=Наушники');


-- Добавляем товары (ссылка на category_id)
INSERT INTO `products` (`id`, `category_id`, `name`, `description`, `image_url`, `price`, `stock_quantity`) VALUES
(1, 1, 'Монитор AOC 24"', 'Отличный монитор для работы и игр.', 'https://via.placeholder.com/300x200?text=AOC+24"', 15990, 10),
(2, 1, 'Монитор Samsung 27"', 'Большой и яркий экран.', 'https://via.placeholder.com/300x200?text=Samsung+27"', 18990, 5),
(3, 2, 'Мышь Razer DeathAdder', 'Игровая мышь с высокой точностью.', 'https://via.placeholder.com/300x200?text=Razer+Mouse', 4990, 50),
(4, 3, 'Клавиатура Logitech K120', 'Надежная клавиатура для офиса.', 'https://via.placeholder.com/300x200?text=Logitech+K120', 3490, 30),
(5, 4, 'Наушники Sony WH-1000XM4', 'Беспроводные наушники с шумоподавлением.', 'https://via.placeholder.com/300x200?text=Sony+WH-1000XM4', 24990, 15);


-- Добавляем администратора (пароль: admin123)
INSERT INTO `users` (`id`, `username`, `email`, `password_hash`, `role_id`) VALUES
(1, 'admin', 'admin@shop.ru', '$2y$10$Nf4JrXQlXq9h4Z5v6b7c8OeaVrJ7Yz8K9L0M1N2P3Q4R5S6T7U8V9W', 1);
Ключевые изменения и преимущес