Загрузка данных
-- =====================================================
-- ЗАДАНИЕ 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 '=== Все корректные операции выполнены успешно ==='