Часть 3 из 16
Теперь у нас есть схема с площадками и событиями, но пока она пуста. В этой части добавим первые записи и проследим путь одной площадки: INSERT создаст её, SELECT покажет выданный ID, а внешний ключ позволит использовать этот ID в событии.
Это важный переход от «таблицы уже созданы» к настоящим данным. Заодно научимся читать сообщения phpMyAdmin и разберём, почему повторный запуск INSERT может незаметно добавить дубликаты.
Вставляем несколько площадок
INSERT INTO venues (name, district, capacity)
VALUES ('Старая электростанция','Центр',1200),
('Парк у реки','Набережная',700),
('Двор депо','Северный район',450);
Перечисляйте столбцы явно: так запрос переживёт перестановку полей в таблице. AUTO_INCREMENT заполнит ключ самостоятельно. Повторный INSERT добавит строки, а не обновит старые.
Узнаём ID и добавляем события
SELECT venue_id, name FROM venues ORDER BY venue_id;
Используйте показанные ID, а не предполагайте, что это обязательно 1, 2 и 3: счётчик может содержать пропуски.
INSERT INTO events (venue_id,name,starts_at,ends_at,status)
VALUES (1,'Открытие: Город звучит','2026-10-30 17:00:00','2026-10-30 23:00:00','open'),
(2,'Дневная сцена у реки','2026-10-31 12:00:00','2026-10-31 20:00:00','planned');
В чистой базе подставьте соответствующие ID из предыдущего результата. Внешний ключ отклонит неизвестный ID.
Читаем таблицу
SELECT event_id, name, starts_at, status FROM events;
phpMyAdmin показывает строки на вкладке «Обзор», а SELECT фиксирует, какие поля нужны. Следом отфильтруем расписание по статусу и дате.
Мини-практика: событие на третьей площадке
Перед INSERT сначала выполните SELECT venue_id, name FROM venues;. Найдите ID строки «Двор депо» и используйте его для нового события. Укажите название, время начала и окончания, затем выполните SELECT с этим ID. Правильный результат — одно событие с нужной площадкой и датами.
Если получили ошибку внешнего ключа, не удаляйте ограничение: проверьте, что ID скопирован без ошибки и площадка действительно есть.
Попробуйте затем намеренно задать время окончания раньше начала. MySQL должен отклонить строку из-за CHECK (ends_at > starts_at). После проверки верните корректное время. Это демонстрирует разницу между проверкой только в phpMyAdmin и ограничением в схеме: правило срабатывает для любого клиента, который подключится к этой базе.
Если повторно запустили начальный INSERT площадок, имена повторятся — это ожидаемо, потому что для них пока нет ограничения уникальности. Уникальность нужно добавлять осознанно: например, два фестиваля вполне могут использовать одну площадку, а название площадки не обязательно уникально в разных городах.
Как не запутаться при повторном запуске
Запросы INSERT из этой части не идемпотентны: повторный запуск добавит ещё такие же по смыслу строки, но с новыми авто-ID. Это нормально для первого знакомства, но неудобно для сценариев, которые нужно запускать много раз.
В учебном проекте можно перед повтором удалить только строки своей тестовой базы и создать их заново; не применяйте этот приём к рабочим продажам.
Если вставка событий завершилась ошибкой, разделите диагностику на три проверки: существует ли выбранный ID площадки; корректен ли формат даты и времени; совпадает ли значение статуса с разрешённым списком. Ошибка от внешнего ключа означает проблему со связью, а от CHECK — нарушение правила.
Текст ошибки обычно называет именно это ограничение.
В phpMyAdmin смотрите не только зелёное уведомление, но и число затронутых строк. После добавления двух событий выполните SELECT и убедитесь, что видите ровно две нужные строки с ожидаемыми датами.
Порядок, который не подведёт
- Добавьте запись в родительскую таблицу
venues. - Прочитайте выданный ID через SELECT.
- Передайте этот ID в событие, которое ссылается на площадку.
- Снова выполните SELECT и проверьте результат.
Это не формальность: внешний ключ не разрешит пропустить первый шаг. В следующем уроке научимся находить среди созданных событий только нужные.
← Предыдущая статья: Схема MySQL: создаём таблицы фестиваля и связи
Следующая статья: WHERE и даты MySQL: находим нужные события →
0
17