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


PRAGMA foreign_keys = ON;

BEGIN;

CREATE TABLE readers (
    reader_id INTEGER PRIMARY KEY,
    full_name VARCHAR(150) NOT NULL,
    phone VARCHAR(30),
    email VARCHAR(150) UNIQUE
);

CREATE TABLE authors (
    author_id INTEGER PRIMARY KEY,
    full_name VARCHAR(150) NOT NULL
);

CREATE TABLE books (
    book_id INTEGER PRIMARY KEY,
    title VARCHAR(200) NOT NULL,
    publication_year INTEGER
        CHECK (publication_year BETWEEN 1 AND 2100),
    genre VARCHAR(80) NOT NULL
);

CREATE TABLE book_authors (
    book_id INTEGER NOT NULL REFERENCES books(book_id),
    author_id INTEGER NOT NULL REFERENCES authors(author_id),
    PRIMARY KEY (book_id, author_id)
);

CREATE TABLE copies (
    copy_id INTEGER PRIMARY KEY,
    book_id INTEGER NOT NULL REFERENCES books(book_id),
    status VARCHAR(20) NOT NULL DEFAULT 'available',
    CHECK (status IN ('available', 'on_loan', 'repair', 'lost'))
);

CREATE TABLE loans (
    loan_id INTEGER PRIMARY KEY,
    reader_id INTEGER NOT NULL REFERENCES readers(reader_id),
    copy_id INTEGER NOT NULL REFERENCES copies(copy_id),
    loan_date DATE NOT NULL,
    return_date DATE,
    CHECK (return_date IS NULL OR return_date >= loan_date)
);

CREATE UNIQUE INDEX one_active_loan_per_copy
    ON loans(copy_id)
    WHERE return_date IS NULL;

CREATE INDEX idx_copies_book
    ON copies(book_id);

CREATE INDEX idx_loans_reader
    ON loans(reader_id);

CREATE INDEX idx_book_authors_author
    ON book_authors(author_id);

INSERT INTO readers (reader_id, full_name, phone, email) VALUES
(1, 'Иван Петров', '+7-000-000-00-01', 'ivan@example.com'),
(2, 'Анна Смирнова', '+7-000-000-00-02', 'anna@example.com'),
(3, 'Мария Иванова', '+7-000-000-00-03', 'maria@example.com'),
(4, 'Алексей Соколов', '+7-000-000-00-04', 'alex@example.com'),
(5, 'Елена Кузнецова', '+7-000-000-00-05', 'elena@example.com'),
(6, 'Дмитрий Волков', '+7-000-000-00-06', 'dmitry@example.com'),
(7, 'Ольга Морозова', '+7-000-000-00-07', 'olga@example.com'),
(8, 'Сергей Орлов', '+7-000-000-00-08', 'sergey@example.com');

INSERT INTO authors (author_id, full_name) VALUES
(1, 'Александр Пушкин'),
(2, 'Лев Толстой'),
(3, 'Фёдор Достоевский'),
(4, 'Антон Чехов'),
(5, 'Михаил Булгаков'),
(6, 'Илья Ильф'),
(7, 'Евгений Петров'),
(8, 'Иван Тургенев');

INSERT INTO books (book_id, title, publication_year, genre) VALUES
(1, 'Евгений Онегин', 1833, 'Роман в стихах'),
(2, 'Капитанская дочка', 1836, 'Исторический роман'),
(3, 'Война и мир', 1869, 'Роман'),
(4, 'Анна Каренина', 1878, 'Роман'),
(5, 'Преступление и наказание', 1866, 'Роман'),
(6, 'Идиот', 1868, 'Роман'),
(7, 'Вишнёвый сад', 1904, 'Пьеса'),
(8, 'Мастер и Маргарита', 1967, 'Роман'),
(9, 'Двенадцать стульев', 1928, 'Сатирический роман'),
(10, 'Отцы и дети', 1862, 'Роман');

INSERT INTO book_authors (book_id, author_id) VALUES
(1, 1),
(2, 1),
(3, 2),
(4, 2),
(5, 3),
(6, 3),
(7, 4),
(8, 5),
(9, 6),
(9, 7),
(10, 8);

INSERT INTO copies (copy_id, book_id, status) VALUES
(1, 1, 'on_loan'),
(2, 1, 'available'),
(3, 2, 'available'),
(4, 3, 'on_loan'),
(5, 3, 'available'),
(6, 4, 'available'),
(7, 5, 'on_loan'),
(8, 5, 'available'),
(9, 6, 'available'),
(10, 7, 'repair'),
(11, 8, 'on_loan'),
(12, 8, 'available'),
(13, 9, 'on_loan'),
(14, 9, 'available'),
(15, 10, 'available');

INSERT INTO loans (
    loan_id, reader_id, copy_id, loan_date, return_date
) VALUES
(1, 1, 2, '2026-09-01', '2026-09-12'),
(2, 2, 3, '2026-09-02', '2026-09-15'),
(3, 3, 5, '2026-09-03', '2026-09-20'),
(4, 4, 6, '2026-09-05', '2026-09-18'),
(5, 5, 8, '2026-09-07', '2026-09-25'),
(6, 6, 12, '2026-09-10', '2026-09-28'),
(7, 7, 14, '2026-09-12', '2026-09-29'),
(8, 1, 1, '2026-10-01', NULL),
(9, 2, 4, '2026-10-02', NULL),
(10, 3, 7, '2026-10-03', NULL),
(11, 4, 11, '2026-10-04', NULL),
(12, 5, 13, '2026-10-05', NULL);

COMMIT;