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


-- =====================================================
-- ЗАДАНИЕ 1: Запуск стартового скрипта и создание таблиц
-- =====================================================
PRAGMA foreign_keys = ON;  -- ЗАДАНИЕ 2: Включение внешних ключей

DROP TABLE IF EXISTS fine;
DROP TABLE IF EXISTS rental;
DROP TABLE IF EXISTS car;
DROP TABLE IF EXISTS user_account;

-- ЗАДАНИЕ 3-5: Таблица user_account
CREATE TABLE user_account (
    user_id INTEGER PRIMARY KEY AUTOINCREMENT,
    full_name TEXT NOT NULL,                     -- ЗАДАНИЕ 3: full_name обязательное
    email TEXT NOT NULL UNIQUE,                  -- ЗАДАНИЕ 4: email обязательный и уникальный
    phone TEXT UNIQUE,                           -- ЗАДАНИЕ 5: phone уникальный, но может быть NULL
    created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
);

-- ЗАДАНИЕ 6-9: Таблица car
CREATE TABLE car (
    car_id INTEGER PRIMARY KEY AUTOINCREMENT,
    plate_no TEXT NOT NULL UNIQUE,               -- ЗАДАНИЕ 6: plate_no обязательное и уникальное
    brand TEXT NOT NULL,                         -- ЗАДАНИЕ 7: brand обязательное
    model TEXT NOT NULL,                         -- ЗАДАНИЕ 7: model обязательное
    year INTEGER NOT NULL CHECK (year BETWEEN 2000 AND 2026), -- ЗАДАНИЕ 8: year от 2000 до 2026
    odometer_km INTEGER NOT NULL DEFAULT 0 CHECK (odometer_km > 0) -- ЗАДАНИЕ 9: >0
);

-- ЗАДАНИЕ 10-17: Таблица rental
CREATE TABLE rental (
    rental_id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,                     -- ЗАДАНИЕ 10: user_id обязательное
    car_id INTEGER NOT NULL,                      -- ЗАДАНИЕ 11: car_id обязательное
    start_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, -- ЗАДАНИЕ 14: start_at с текущей датой
    end_at TEXT,                                  -- может быть NULL
    status TEXT NOT NULL CHECK (status IN ('NEW', 'ACTIVE', 'FINISHED', 'CANCELLED')), -- ЗАДАНИЕ 15
    cost_amount NUMERIC NOT NULL DEFAULT 0 CHECK (cost_amount >= 0), -- ЗАДАНИЕ 17
    -- ЗАДАНИЕ 12: внешний ключ user_id -> user_account
    FOREIGN KEY (user_id) REFERENCES user_account(user_id),
    -- ЗАДАНИЕ 13: внешний ключ car_id -> car
    FOREIGN KEY (car_id) REFERENCES car(car_id),
    -- ЗАДАНИЕ 16: end_at > start_at (если end_at не NULL)
    CHECK (end_at IS NULL OR end_at > start_at)
);

-- ЗАДАНИЕ 18-21: Таблица fine
CREATE TABLE fine (
    fine_id INTEGER PRIMARY KEY AUTOINCREMENT,
    rental_id INTEGER NOT NULL,                   -- ЗАДАНИЕ 18: rental_id обязательное
    amount NUMERIC NOT NULL CHECK (amount >= 0),  -- ЗАДАНИЕ 20: amount >= 0
    reason TEXT NOT NULL,                         -- ЗАДАНИЕ 21: reason обязательное
    -- ЗАДАНИЕ 19: внешний ключ rental_id -> rental
    FOREIGN KEY (rental_id) REFERENCES rental(rental_id)
);

-- =====================================================
-- ЗАДАНИЕ 22: Проверка структуры таблиц
-- =====================================================
.print '=== Структура таблицы user_account ==='
PRAGMA table_info(user_account);

.print '=== Структура таблицы car ==='
PRAGMA table_info(car);

.print '=== Структура таблицы rental ==='
PRAGMA table_info(rental);

.print '=== Структура таблицы fine ==='
PRAGMA table_info(fine);

-- =====================================================
-- ЗАДАНИЕ 23: Проверка внешних ключей
-- =====================================================
.print '=== Внешние ключи таблицы rental ==='
PRAGMA foreign_key_list(rental);

.print '=== Внешние ключи таблицы fine ==='
PRAGMA foreign_key_list(fine);

-- =====================================================
-- ЗАДАНИЕ 24: Вставка и удаление пользователей
-- =====================================================
-- Вставка 2 корректных пользователей
INSERT INTO user_account (full_name, email, phone) VALUES 
    ('Иван Петров', 'ivan@example.com', '+7-900-123-45-67'),
    ('Мария Сидорова', 'maria@example.com', '+7-900-987-65-43');

-- Удаление одного из них (по уникальному email)
DELETE FROM user_account WHERE email = 'maria@example.com';

-- =====================================================
-- ЗАДАНИЕ 25: Вставка 2 корректных автомобилей
-- =====================================================
INSERT INTO car (plate_no, brand, model, year, odometer_km) VALUES 
    ('A123BC', 'Toyota', 'Camry', 2020, 15000),
    ('B456DE', 'Honda', 'Civic', 2022, 5000);

-- =====================================================
-- ЗАДАНИЕ 26: Аренда со статусом ACTIVE без end_at
-- =====================================================
INSERT INTO rental (user_id, car_id, status, cost_amount) VALUES 
    (1, 1, 'ACTIVE', 5000);

-- =====================================================
-- ЗАДАНИЕ 27: Аренда со статусом FINISHED и end_at позже start_at
-- =====================================================
INSERT INTO rental (user_id, car_id, start_at, end_at, status, cost_amount) VALUES 
    (1, 2, '2025-01-01 10:00:00', '2025-01-05 18:00:00', 'FINISHED', 20000);

-- =====================================================
-- ЗАДАНИЕ 28: Штраф для существующей аренды
-- =====================================================
INSERT INTO fine (rental_id, amount, reason) VALUES 
    (2, 500, 'Возврат с опозданием');

-- =====================================================
-- ЗАДАНИЕ 29: Ошибка UNIQUE при дублировании email
-- =====================================================
-- Следующая вставка вызовет ошибку UNIQUE constraint failed
-- INSERT INTO user_account (full_name, email, phone) VALUES 
--     ('Петр Сидоров', 'ivan@example.com', '+7-900-111-22-33');

-- =====================================================
-- ЗАДАНИЕ 30: Ошибка CHECK при year = 1999
-- =====================================================
-- INSERT INTO car (plate_no, brand, model, year, odometer_km) VALUES 
--     ('C789FG', 'Ford', 'Focus', 1999, 10000);

-- =====================================================
-- ЗАДАНИЕ 31: Ошибка CHECK при odometer_km = -10
-- =====================================================
-- INSERT INTO car (plate_no, brand, model, year, odometer_km) VALUES 
--     ('C789FG', 'Ford', 'Focus', 2015, -10);

-- =====================================================
-- ЗАДАНИЕ 32: Ошибка CHECK при статусе IN_PROGRESS
-- =====================================================
-- INSERT INTO rental (user_id, car_id, status, cost_amount) VALUES 
--     (1, 1, 'IN_PROGRESS', 3000);

-- =====================================================
-- ЗАДАНИЕ 33: Ошибка CHECK при end_at раньше start_at
-- =====================================================
-- INSERT INTO rental (user_id, car_id, start_at, end_at, status, cost_amount) VALUES 
--     (1, 1, '2025-02-01 10:00:00', '2025-01-30 18:00:00', 'FINISHED', 10000);

-- =====================================================
-- ЗАДАНИЕ 34: Ошибка FOREIGN KEY при несуществующем rental_id
-- =====================================================
-- INSERT INTO fine (rental_id, amount, reason) VALUES 
--     (999, 1000, 'Штраф за несуществующую аренду');

-- =====================================================
-- ЗАДАНИЕ 35: Итоговый SQL-файл сохранён
-- =====================================================
.print '=== Все корректные операции выполнены успешно ==='