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


CREATE DATABASE IF NOT EXISTS book_exchange
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

USE book_exchange;


-- =========================
-- Пользователи
-- =========================
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    login VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    username VARCHAR(100) NOT NULL,
    status VARCHAR(30) NOT NULL DEFAULT 'active'
);


-- =========================
-- Книги
-- =========================
CREATE TABLE books (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    description TEXT,
    price DECIMAL(10,2) DEFAULT 0.00,
    quantity INT NOT NULL DEFAULT 0,
    cover VARCHAR(255)
);


-- =========================
-- Состояние книги
-- =========================
CREATE TABLE conditions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);


-- =========================
-- Конкретные экземпляры книг
-- =========================
CREATE TABLE copies (
    id INT AUTO_INCREMENT PRIMARY KEY,
    book_id INT NOT NULL,
    owner_id INT NOT NULL,
    condition_id INT NOT NULL,
    status VARCHAR(30) NOT NULL DEFAULT 'available',

    FOREIGN KEY (book_id)
        REFERENCES books(id)
        ON DELETE CASCADE,

    FOREIGN KEY (owner_id)
        REFERENCES users(id)
        ON DELETE CASCADE,

    FOREIGN KEY (condition_id)
        REFERENCES conditions(id)
        ON DELETE RESTRICT
);


-- =========================
-- Акт передачи
-- =========================
CREATE TABLE transfers (
    id INT AUTO_INCREMENT PRIMARY KEY,

    source_id INT NOT NULL,
    destination_id INT NOT NULL,
    copy_id INT NOT NULL,

    transfer_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    return_date DATETIME NULL,
    status VARCHAR(30) NOT NULL DEFAULT 'active',

    FOREIGN KEY (source_id)
        REFERENCES users(id)
        ON DELETE RESTRICT,

    FOREIGN KEY (destination_id)
        REFERENCES users(id)
        ON DELETE RESTRICT,

    FOREIGN KEY (copy_id)
        REFERENCES copies(id)
        ON DELETE RESTRICT
);