Загрузка данных
-- =====================================================
-- База данных: Разведение кроликов (SQLite)
-- Версия 1.0
-- =====================================================
-- Включаем поддержку внешних ключей
PRAGMA foreign_keys = ON;
-- =====================================================
-- 1. Создание таблиц (справочников)
-- =====================================================
-- Таблица пород
CREATE TABLE IF NOT EXISTS Porody (
ID_Porody INTEGER PRIMARY KEY AUTOINCREMENT,
Nazvanie TEXT NOT NULL,
Napravlenie TEXT NOT NULL,
Osobennosti TEXT
);
-- Таблица клеток/загонов
CREATE TABLE IF NOT EXISTS Zagony (
ID_Zagona INTEGER PRIMARY KEY AUTOINCREMENT,
Nazvanie TEXT NOT NULL,
Vmestimost INTEGER NOT NULL CHECK (Vmestimost > 0),
Tip TEXT NOT NULL,
Razmer TEXT NOT NULL CHECK (Razmer IN ('Для маленьких', 'Для средних', 'Для больших', 'Смешанный'))
);
-- Таблица кормов
CREATE TABLE IF NOT EXISTS Korma (
ID_Korma INTEGER PRIMARY KEY AUTOINCREMENT,
Nazvanie TEXT NOT NULL,
Tip TEXT NOT NULL,
EdIzm TEXT NOT NULL
);
-- Таблица персонала
CREATE TABLE IF NOT EXISTS Personal (
ID_Sotrudnika INTEGER PRIMARY KEY AUTOINCREMENT,
FIO TEXT NOT NULL,
Dolzhnost TEXT NOT NULL,
Telefon TEXT
);
-- Таблица животных (основная)
CREATE TABLE IF NOT EXISTS Animals (
ID_Zhivotnogo INTEGER PRIMARY KEY AUTOINCREMENT,
Klichka TEXT NOT NULL,
Pol TEXT NOT NULL CHECK (Pol IN ('Самец', 'Самка')),
DataRozhdeniya DATE NOT NULL,
ID_Porody INTEGER NOT NULL,
ID_Zagona INTEGER NOT NULL,
Status TEXT NOT NULL CHECK (Status IN ('В стаде', 'На карантине', 'Выбыло')),
FOREIGN KEY (ID_Porody) REFERENCES Porody(ID_Porody) ON DELETE RESTRICT,
FOREIGN KEY (ID_Zagona) REFERENCES Zagony(ID_Zagona) ON DELETE RESTRICT
);
-- =====================================================
-- 2. Создание таблиц (журналов)
-- =====================================================
-- Журнал кормления
CREATE TABLE IF NOT EXISTS FeedingLog (
ID_Zapisi INTEGER PRIMARY KEY AUTOINCREMENT,
Data DATE NOT NULL,
Vremya TIME NOT NULL,
ID_Zhivotnogo INTEGER NOT NULL,
ID_Korma INTEGER NOT NULL,
Kolichestvo REAL NOT NULL CHECK (Kolichestvo > 0),
ID_Sotrudnika INTEGER NOT NULL,
FOREIGN KEY (ID_Zhivotnogo) REFERENCES Animals(ID_Zhivotnogo) ON DELETE CASCADE,
FOREIGN KEY (ID_Korma) REFERENCES Korma(ID_Korma) ON DELETE RESTRICT,
FOREIGN KEY (ID_Sotrudnika) REFERENCES Personal(ID_Sotrudnika) ON DELETE RESTRICT
);
-- Журнал окрола и ветмероприятий
CREATE TABLE IF NOT EXISTS VetReproLog (
ID_Sobytiya INTEGER PRIMARY KEY AUTOINCREMENT,
Data DATE NOT NULL,
ID_Zhivotnogo INTEGER NOT NULL,
TipSobytiya TEXT NOT NULL CHECK (TipSobytiya IN ('Окрол', 'Прививка', 'Болезнь', 'Случка', 'Осмотр', 'Отсадка')),
Opisanie TEXT,
ID_Sotrudnika INTEGER NOT NULL,
FOREIGN KEY (ID_Zhivotnogo) REFERENCES Animals(ID_Zhivotnogo) ON DELETE CASCADE,
FOREIGN KEY (ID_Sotrudnika) REFERENCES Personal(ID_Sotrudnika) ON DELETE RESTRICT
);
-- =====================================================
-- 3. Создание индексов для ускорения запросов
-- =====================================================
CREATE INDEX IF NOT EXISTS idx_animals_poroda ON Animals(ID_Porody);
CREATE INDEX IF NOT EXISTS idx_animals_zagon ON Animals(ID_Zagona);
CREATE INDEX IF NOT EXISTS idx_animals_status ON Animals(Status);
CREATE INDEX IF NOT EXISTS idx_feeding_data ON FeedingLog(Data);
CREATE INDEX IF NOT EXISTS idx_feeding_animal ON FeedingLog(ID_Zhivotnogo);
CREATE INDEX IF NOT EXISTS idx_feeding_time ON FeedingLog(Vremya);
CREATE INDEX IF NOT EXISTS idx_vet_animal ON VetReproLog(ID_Zhivotnogo);
CREATE INDEX IF NOT EXISTS idx_vet_data ON VetReproLog(Data);
CREATE INDEX IF NOT EXISTS idx_vet_type ON VetReproLog(TipSobytiya);
-- =====================================================
-- 4. Заполнение тестовыми данными
-- =====================================================
-- Заполняем породы кроликов
INSERT OR IGNORE INTO Porody (ID_Porody, Nazvanie, Napravlenie, Osobennosti) VALUES
(1, 'Советская шиншилла', 'Мясо-шкурковая', 'Крупная порода (до 5 кг). Хорошо адаптируется к холодному климату. Плодовитость высокая — 7-8 крольчат за окрол.'),
(2, 'Калифорнийская', 'Мясная', 'Скороспелая порода. В 3-4 месяца уже 2-3 кг. Хорошие материнские качества. Требует качественного комбикорма.'),
(3, 'Новозеландская белая', 'Мясная', 'Очень скороспелая (2-2.5 кг к 3 месяцам). Спокойный характер. Легко переносит клеточное содержание.'),
(4, 'Фландр', 'Мясо-шкурковая', 'Гигантская порода (до 8-10 кг). Требует просторных клеток. Ест много корма. Склонность к ожирению.'),
(5, 'Бабочка', 'Декоративно-мясная', 'Средняя порода (3-4 кг). Очень плодовитая (до 9 крольчат). Красивая окраска.'),
(6, 'Серебристый', 'Мясо-шкурковая', 'Холодостойкая порода. Хорошо набирает вес. Качественная шкурка.');
-- Заполняем клетки/загоны
INSERT OR IGNORE INTO Zagony (ID_Zagona, Nazvanie, Vmestimost, Tip, Razmer) VALUES
(1, 'Основной шед №1', 30, 'Клеточная батарея', 'Для средних'),
(2, 'Основной шед №2', 30, 'Клеточная батарея', 'Для средних'),
(3, 'Родильное отделение', 15, 'Индивидуальные клетки', 'Для маленьких'),
(4, 'Молодняк', 40, 'Общий загон', 'Для маленьких'),
(5, 'Карантин', 10, 'Изолированные клетки', 'Смешанный'),
(6, 'Откормочный цех', 25, 'Клеточная батарея', 'Для больших'),
(7, 'Самец-производитель', 5, 'Индивидуальные клетки', 'Для больших');
-- Заполняем корма для кроликов
INSERT OR IGNORE INTO Korma (ID_Korma, Nazvanie, Tip, EdIzm) VALUES
(1, 'Сено разнотравное', 'Грубый', 'кг'),
(2, 'Комбикорм (ПК-90)', 'Концентрированный', 'кг'),
(3, 'Овёс', 'Концентрированный', 'кг'),
(4, 'Ячмень', 'Концентрированный', 'кг'),
(5, 'Морковь', 'Сочный', 'кг'),
(6, 'Свекла кормовая', 'Сочный', 'кг'),
(7, 'Трава свежая (летом)', 'Зелёный', 'кг'),
(8, 'Соль-лизунец', 'Минеральный', 'шт'),
(9, 'Вода', 'Питьевая', 'л');
-- Заполняем персонал
INSERT OR IGNORE INTO Personal (ID_Sotrudnika, FIO, Dolzhnost, Telefon) VALUES
(1, 'Кроликов Андрей Викторович', 'Главный кроликовод', '+7 (123) 456-78-90'),
(2, 'Зайцева Мария Петровна', 'Ветврач', '+7 (123) 456-78-91'),
(3, 'Пушкин Дмитрий Сергеевич', 'Кроликовод', '+7 (123) 456-78-92'),
(4, 'Лисова Елена Владимировна', 'Кроликовод', '+7 (123) 456-78-93'),
(5, 'Норкин Иван Алексеевич', 'Разнорабочий', '+7 (123) 456-78-94');
-- Заполняем животных (кролики)
INSERT OR IGNORE INTO Animals (ID_Zhivotnogo, Klichka, Pol, DataRozhdeniya, ID_Porody, ID_Zagona, Status) VALUES
(1, 'Рекс', 'Самец', '2022-05-10', 4, 7, 'В стаде'),
(2, 'Белка', 'Самка', '2022-08-15', 3, 1, 'В стаде'),
(3, 'Серый', 'Самец', '2023-01-20', 1, 2, 'В стаде'),
(4, 'Марта', 'Самка', '2023-02-14', 2, 3, 'В стаде'),
(5, 'Ушастик', 'Самец', '2023-03-01', 5, 1, 'В стаде'),
(6, 'Снежка', 'Самка', '2023-03-10', 3, 3, 'В стаде'),
(7, 'Черныш', 'Самец', '2023-04-05', 6, 2, 'В стаде'),
(8, 'Золотко', 'Самка', '2023-04-12', 1, 4, 'В стаде'),
(9, 'Рыжик', 'Самец', '2023-05-01', 5, 1, 'На карантине'),
(10, 'Лапка', 'Самка', '2023-05-20', 2, 3, 'В стаде'),
(11, 'Гигант', 'Самец', '2022-11-15', 4, 7, 'В стаде'),
(12, 'Пушинка', 'Самка', '2023-06-10', 3, 4, 'В стаде');
-- =====================================================
-- 5. Заполнение журнала кормления (35+ строк)
-- =====================================================
INSERT OR IGNORE INTO FeedingLog (ID_Zapisi, Data, Vremya, ID_Zhivotnogo, ID_Korma, Kolichestvo, ID_Sotrudnika) VALUES
(1, '2025-02-01', '08:00:00', 1, 1, 0.3, 1),
(2, '2025-02-01', '08:00:00', 1, 2, 0.15, 1),
(3, '2025-02-01', '08:15:00', 2, 1, 0.25, 3),
(4, '2025-02-01', '08:15:00', 2, 2, 0.12, 3),
(5, '2025-02-01', '17:00:00', 1, 1, 0.3, 4),
(6, '2025-02-01', '17:00:00', 1, 9, 0.5, 4),
(7, '2025-02-02', '08:00:00', 3, 1, 0.25, 1),
(8, '2025-02-02', '08:00:00', 3, 3, 0.1, 1),
(9, '2025-02-02', '08:30:00', 4, 1, 0.2, 3),
(10, '2025-02-02', '08:30:00', 4, 2, 0.1, 3),
(11, '2025-02-02', '17:30:00', 5, 1, 0.2, 4),
(12, '2025-02-02', '17:30:00', 5, 4, 0.1, 4),
(13, '2025-02-03', '07:45:00', 6, 1, 0.2, 1),
(14, '2025-02-03', '07:45:00', 6, 2, 0.12, 1),
(15, '2025-02-03', '17:00:00', 7, 1, 0.25, 3),
(16, '2025-02-03', '17:00:00', 7, 5, 0.1, 3),
(17, '2025-02-04', '08:00:00', 8, 1, 0.2, 4),
(18, '2025-02-04', '08:00:00', 8, 2, 0.1, 4),
(19, '2025-02-04', '17:15:00', 9, 1, 0.2, 1),
(20, '2025-02-04', '17:15:00', 9, 6, 0.08, 1),
(21, '2025-02-05', '08:00:00', 10, 1, 0.2, 3),
(22, '2025-02-05', '08:00:00', 10, 2, 0.12, 3),
(23, '2025-02-05', '17:00:00', 11, 1, 0.35, 4),
(24, '2025-02-05', '17:00:00', 11, 2, 0.18, 4),
(25, '2025-02-06', '07:30:00', 12, 1, 0.2, 1),
(26, '2025-02-06', '07:30:00', 12, 2, 0.1, 1),
(27, '2025-02-06', '17:30:00', 1, 1, 0.3, 3),
(28, '2025-02-07', '08:00:00', 2, 1, 0.25, 4),
(29, '2025-02-07', '08:00:00', 2, 9, 0.5, 4),
(30, '2025-02-07', '17:00:00', 3, 1, 0.25, 1),
(31, '2025-02-08', '08:15:00', 4, 1, 0.2, 3),
(32, '2025-02-08', '08:15:00', 4, 5, 0.1, 3),
(33, '2025-02-08', '17:00:00', 5, 1, 0.2, 4),
(34, '2025-02-09', '07:45:00', 6, 1, 0.2, 1),
(35, '2025-02-09', '07:45:00', 6, 2, 0.12, 1),
(36, '2025-02-09', '17:15:00', 7, 1, 0.25, 3),
(37, '2025-02-10', '08:00:00', 8, 1, 0.2, 4),
(38, '2025-02-10', '08:00:00', 8, 2, 0.1, 4),
(39, '2025-02-10', '17:00:00', 9, 1, 0.2, 1),
(40, '2025-02-11', '08:00:00', 10, 1, 0.2, 3),
(41, '2025-02-11', '08:00:00', 10, 6, 0.1, 3),
(42, '2025-02-11', '17:00:00', 11, 1, 0.35, 4),
(43, '2025-02-12', '07:30:00', 12, 1, 0.2, 1),
(44, '2025-02-12', '07:30:00', 12, 2, 0.1, 1),
(45, '2025-02-12', '17:30:00', 1, 7, 0.5, 3);
-- =====================================================
-- 6. Заполнение журнала окролов и мероприятий (35+ строк)
-- =====================================================
INSERT OR IGNORE INTO VetReproLog (ID_Sobytiya, Data, ID_Zhivotnogo, TipSobytiya, Opisanie, ID_Sotrudnika) VALUES
(1, '2025-01-05', 2, 'Окрол', 'Родилось 8 крольчат (все живы)', 2),
(2, '2025-01-10', 4, 'Окрол', 'Родилось 7 крольчат', 2),
(3, '2025-01-15', 6, 'Окрол', 'Родилось 9 крольчат (2 погибло)', 2),
(4, '2025-01-20', 8, 'Окрол', 'Родилось 6 крольчат', 2),
(5, '2025-01-25', 10, 'Окрол', 'Родилось 8 крольчат', 2),
(6, '2025-01-28', 1, 'Случка', 'Спаривание с самкой Белка (ID 2)', 1),
(7, '2025-01-29', 3, 'Случка', 'Спаривание с самкой Марта (ID 4)', 1),
(8, '2025-01-30', 5, 'Случка', 'Спаривание с самкой Снежка (ID 6)', 1),
(9, '2025-02-01', 1, 'Осмотр', 'Плановый осмотр, здоров', 2),
(10, '2025-02-02', 2, 'Осмотр', 'После окрола, здорова', 2),
(11, '2025-02-03', 3, 'Прививка', 'Вакцинация от миксоматоза', 2),
(12, '2025-02-03', 4, 'Осмотр', 'Подготовка к случке', 2),
(13, '2025-02-04', 5, 'Прививка', 'Вакцинация от ВГБК', 2),
(14, '2025-02-05', 6, 'Осмотр', 'После окрола, здорова', 2),
(15, '2025-02-06', 7, 'Прививка', 'Вакцинация от миксоматоза', 2),
(16, '2025-02-07', 8, 'Осмотр', 'Кормление крольчат, нормально', 2),
(17, '2025-02-08', 9, 'Болезнь', 'Кашель, насморк — лечение антибиотиками', 2),
(18, '2025-02-09', 10, 'Осмотр', 'Готовность к случке', 2),
(19, '2025-02-10', 11, 'Случка', 'Спаривание с самкой Пушинка (ID 12)', 1),
(20, '2025-02-11', 12, 'Осмотр', 'Плановый осмотр, здорова', 2),
(21, '2025-02-12', 1, 'Случка', 'Повторная случка с самкой Золотко (ID 8)', 1),
(22, '2025-02-13', 2, 'Осмотр', 'Плановый осмотр', 2),
(23, '2025-02-14', 3, 'Осмотр', 'Плановый осмотр', 2),
(24, '2025-02-15', 4, 'Случка', 'Повторная случка', 1),
(25, '2025-02-16', 5, 'Осмотр', 'Плановый осмотр', 2),
(26, '2025-02-17', 6, 'Отсадка', 'Крольчата отсажены в отдельную клетку (8 голов)', 3),
(27, '2025-02-18', 7, 'Осмотр', 'После болезни, здоров', 2),
(28, '2025-02-19', 8, 'Окрол', 'Родилось 7 крольчат', 2),
(29, '2025-02-20', 9, 'Осмотр', 'После карантина, здоров', 2),
(30, '2025-02-21', 10, 'Окрол', 'Родилось 8 крольчат', 2),
(31, '2025-02-22', 11, 'Осмотр', 'Плановый осмотр', 2),
(32, '2025-02-23', 12, 'Окрол', 'Родилось 9 крольчат (все живы)', 2),
(33, '2025-02-24', 1, 'Осмотр', 'Плановый осмотр', 2),
(34, '2025-02-25', 2, 'Прививка', 'Ревакцинация', 2),
(35, '2025-02-26', 3, 'Осмотр', 'Плановый осмотр', 2),
(36, '2025-02-27', 4, 'Окрол', 'Родилось 7 крольчат', 2),
(37, '2025-02-28', 5, 'Осмотр', 'Плановый осмотр', 2),
(38, '2025-03-01', 6, 'Прививка', 'Вакцинация крольчат', 2),
(39, '2025-03-02', 7, 'Осмотр', 'Плановый осмотр', 2),
(40, '2025-03-03', 8, 'Осмотр', 'После окрола', 2),
(41, '2025-03-04', 9, 'Прививка', 'Вакцинация от миксоматоза', 2),
(42, '2025-03-05', 10, 'Осмотр', 'После окрола', 2),
(43, '2025-03-06', 11, 'Случка', 'Спаривание с новой самкой', 1),
(44, '2025-03-07', 12, 'Осмотр', 'После окрола', 2),
(45, '2025-03-08', 1, 'Осмотр', 'Плановый осмотр', 2);
-- =====================================================
-- 7. Проверка количества записей в журналах
-- =====================================================
SELECT 'FeedingLog' AS Zhurnal, COUNT(*) AS Stroki FROM FeedingLog
UNION ALL
SELECT 'VetReproLog', COUNT(*) FROM VetReproLog;
-- =====================================================
-- 8. Полезные запросы для кролиководческой фермы
-- =====================================================
-- Запрос 1: Список всех кроликов с информацией о породе и клетке
-- SELECT
-- a.ID_Zhivotnogo,
-- a.Klichka,
-- a.Pol,
-- a.DataRozhdeniya,
-- p.Nazvanie AS Poroda,
-- p.Napravlenie,
-- z.Nazvanie AS Kletka,
-- z.Razmer AS RazmerKletki,
-- a.Status
-- FROM Animals a
-- JOIN Porody p ON a.ID_Porody = p.ID_Porody
-- JOIN Zagony z ON a.ID_Zagona = z.ID_Zagona
-- ORDER BY a.Status, a.Klichka;
-- Запрос 2: Получить всех самок в родильном отделении
-- SELECT * FROM Animals WHERE Pol = 'Самка' AND ID_Zagona = 3 AND Status = 'В стаде';
-- Запрос 3: Расход кормов по месяцам
-- SELECT
-- strftime('%Y-%m', Data) AS Mesyats,
-- k.Nazvanie,
-- SUM(fl.Kolichestvo) AS Rashod,
-- k.EdIzm
-- FROM FeedingLog fl
-- JOIN Korma k ON fl.ID_Korma = k.ID_Korma
-- GROUP BY strftime('%Y-%m', Data), k.Nazvanie
-- ORDER BY Mesyats DESC, Rashod DESC;
-- Запрос 4: Статистика по окролам
-- SELECT
-- a.Klichka,
-- COUNT(*) AS KolichestvoOkrolov,
-- MAX(v.Data) AS PosledniyOkrol
-- FROM VetReproLog v
-- JOIN Animals a ON v.ID_Zhivotnogo = a.ID_Zhivotnogo
-- WHERE v.TipSobytiya = 'Окрол'
-- GROUP BY a.Klichka
-- ORDER BY KolichestvoOkrolov DESC;
-- Запрос 5: Кролики, которым нужна прививка (не было в этом месяце)
-- SELECT a.Klichka, a.Pol
-- FROM Animals a
-- WHERE a.Status = 'В стаде'
-- AND a.ID_Zhivotnogo NOT IN (
-- SELECT DISTINCT ID_Zhivotnogo
-- FROM VetReproLog
-- WHERE TipSobytiya = 'Прививка'
-- AND Data >= date('now', 'start of month')
-- );
-- =====================================================
-- Конец скрипта
-- =====================================================