Используйте идентификаторы реально вставленных клиентов, а не предполагайте, что SERIAL начнётся с 1. В PostgreSQL удобно объединить INSERT ... RETURNING и вставку покупок в одном CTE.
Вставка тестовых записей в таблицы
Используйте идентификаторы реально вставленных клиентов, а не предполагайте, что SERIAL начнётся с 1. В PostgreSQL удобно объединить INSERT ... RETURNING и вставку покупок в одном CTE.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Сформировать SQL‑запросы для наполнения тестовыми данными:
-
В таблицу customers добавить несколько записей (примерно 3‑5) с полями имени.
-
В таблицу purchases добавить несколько записей, при этом:
- customer_id должен ссылаться на существующую запись из customers;
- purchase_date задаётся различными датами и временем.
Требования:
- Сохранить целостность ссылок между клиентами и покупками.
- У одного из клиентов должно быть более одного заказа.
Ответ
Используйте идентификаторы реально вставленных клиентов, а не предполагайте, что SERIAL начнётся с 1. В PostgreSQL удобно объединить INSERT ... RETURNING и вставку покупок в одном CTE.
Пример для тестовой БД:
WITH new_customers AS (
INSERT INTO customers (name)
VALUES ('Анна'), ('Борис'), ('Вера')
RETURNING id, name
)
INSERT INTO purchases (customer_id, purchase_date)
SELECT c.id, v.purchased_at
FROM new_customers AS c
JOIN (VALUES
('Анна', TIMESTAMP '2026-01-10 10:00:00'),
('Анна', TIMESTAMP '2026-01-12 15:30:00'),
('Борис', TIMESTAMP '2026-01-11 09:00:00'),
('Вера', TIMESTAMP '2026-01-13 18:00:00')
) AS v(name, purchased_at) ON v.name = c.name;
Имена уникальны только внутри набора примера; связь строится с возвращёнными новыми строками. Анна получает два заказа. Команда не предназначена для повторного запуска как идемпотентный production-import.