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


-- Создание базы данных
CREATE DATABASE LibraryDB;
GO
USE LibraryDB;
GO

-- 1. Таблица: Книга
CREATE TABLE Книга (
    ID_Книги INT IDENTITY(1,1) PRIMARY KEY,
    Название NVARCHAR(255) NOT NULL,
    Фамилия_Автора NVARCHAR(100) NULL,
    Фамилия_Соавторов NVARCHAR(255) NULL,
    Место_Издания NVARCHAR(100) NULL,
    Издательство NVARCHAR(100) NULL,
    Год_Издания INT NULL,
    Кол_Страниц INT NULL,
    Кол_Экземпляров INT NULL,
    
    -- Ограничение: книги, изданные начиная с 1960 по текущий год (2026)
    CONSTRAINT CHK_Год_Издания CHECK (Год_Издания BETWEEN 1960 AND 2026),
    
    -- Ограничение: соавторы не могут существовать без основного автора
    CONSTRAINT CHK_Соавторство CHECK (
        (Фамилия_Соавторов IS NULL) OR 
        (Camp_Соавторов IS NOT NULL AND Фамилия_Автора IS NOT NULL)
    )
);
GO

-- 2. Таблица: Экземпляр книги
CREATE TABLE Экземпляр_Книги (
    Инвентарный_Номер INT PRIMARY KEY,
    ID_Книги INT NOT NULL,
    Шифр_Книги NVARCHAR(50) NOT NULL,
    Присутствие BIT NOT NULL DEFAULT 1,
    
    -- Внешний ключ: при удалении книги удаляются и её копии
    CONSTRAINT FK_Экземпляр_Книга FOREIGN KEY (ID_Книги)
        REFERENCES Книга(ID_Книги) ON DELETE CASCADE
);
GO

-- 3. Таблица: Читатель
CREATE TABLE Читатель (
    Номер_Билета INT IDENTITY(1,1) PRIMARY KEY,
    ФИО NVARCHAR(150) NOT NULL,
    Домашний_Адрес NVARCHAR(255) NOT NULL,
    Телефон_Рабочий NVARCHAR(20) NULL,
    Телефон_Домашний NVARCHAR(20) NULL,
    Дата_Рождения DATE NOT NULL,
    
    -- Ограничение: возраст читателя не моложе 17 лет
    CONSTRAINT CHK_Возраст CHECK (DATEDIFF(year, Дата_Рождения, GETDATE()) >= 17),
    
    -- Ограничение: обязательное наличие хотя бы одного из двух телефонов
    CONSTRAINT CHK_Телефоны CHECK (Телефон_Рабочий IS NOT NULL OR Телефон_Домашний IS NOT NULL)
);
GO

-- 4. Таблица: Выдача книги
CREATE TABLE Выдача_Книги (
    ID_Выдачи INT IDENTITY(1,1) PRIMARY KEY,
    Инвентарный_Номер INT NOT NULL,
    Номер_Билета INT NOT NULL,
    Дата_Выдачи DATE NOT NULL DEFAULT GETDATE(),
    Дата_Возврата DATE NULL,
    
    -- Внешние ключи для связи сущностей
    CONSTRAINT FK_Выдача_Экземпляр FOREIGN KEY (Инвентарный_Номер)
        REFERENCES Экземпляр_Книги(Инвентарный_Номер),
        
    CONSTRAINT FK_Выдача_Читатель FOREIGN KEY (Номер_Билета)
        REFERENCES Читатель(Номер_Билета)
);
GO