Добавление нескольких строк
Одним INSERT можно добавить сразу несколько строк. После VALUES напишите пару скобок для каждой строки и разделите их запятыми. Вот три новых отзыва от клиентов, которые купили игры:
INSERT INTO reviews (game_id, customer_id, stars, comment)
VALUES
(4, 4, 5, 'Hours of fun.'),
(14, 2, 4, NULL),
(17, 1, 4, 'Fast and fair.');Тогда на вкладке «Результаты» будет Изменено строк: 3. У всех строк общий список столбцов, поэтому в каждой строке нужно значение для каждого столбца: у второго отзыва нет комментария, поэтому в нём NULL. Между строками ставится запятая, а после последней — точка с запятой. Несколько строк в одной инструкции писать быстрее, чем по одному INSERT на каждую, и базе данных добавлять их тоже быстрее.
Заполнять каждый столбец не обязательно. Столбец, который вы не указали в списке, получает NULL. Здесь у отзыва нет комментария:
INSERT INTO reviews (game_id, customer_id, stars)
VALUES (20, 2, 5);
SELECT *
FROM reviews
WHERE game_id = 20;| game_id | customer_id | stars | comment |
|---|---|---|---|
| 20 | 2 | 5 | NULL |
| 20 | 4 | 4 | NULL |
Это работает только для столбцов, которые могут быть пустыми. Большинство столбцов таблиц магазина обязаны иметь значение, и если пропустить такой столбец, например stars, база данных откажется принять строку: NOT NULL constraint failed: reviews.stars. Об этих правилах вы скоро узнаете больше.
ID — особый случай. Столбец id, который в таблице объявлен как INTEGER PRIMARY KEY (таковы все столбцы id в Pixel Shop), заполняется сам: пропустите его, и SQLite даст новой строке следующий номер — наибольший ID в таблице плюс один. Заказы идут до 30, поэтому новый заказ получит 31:
INSERT INTO orders (customer_id, ordered_at, status)
VALUES (14, '2026-01-08', 'paid');
SELECT *
FROM orders
WHERE id > 28;| id | customer_id | ordered_at | status |
|---|---|---|---|
| 29 | 3 | 2025-12-12 | paid |
| 30 | 4 | 2025-12-22 | paid |
| 31 | 14 | 2026-01-08 | paid |
Так настоящие приложения и добавляют строки: ID выбирает база данных. Если выбрать его самим, он может оказаться занят, и база откажется принять строку (UNIQUE constraint failed: orders.id). В предыдущем упражнении вы выбирали ID только затем, чтобы знать, какие строки искать.
Типичная ошибка: запятая после последней строки. VALUES (4, 4, 5), (14, 2, 4),; заканчивается ошибкой near ";": syntax error. Между строками стоит запятая, а после последней — только точка с запятой.
Задание
- 1
В магазине объявили три новые игры, которые ещё не вышли: Frost Giants (RPG, $55, от 16 лет), Pet Hotel (Simulation, $20, от 3 лет) и Sky Racers (Racing, $35, от 7 лет). Добавьте их одним
INSERT. Столбецid, который заполняется сам, и столбецreleasedпропустите: даты выхода пока неизвестны. - 2
Ниже покажите ID, название, цену и дату выхода всех игр, которые ещё не вышли, отсортировав их по ID. Новые получили ID с 21 по 23 и остались без даты выхода:
id title price released 18 Robot Rebellion 40 NULL 19 Mystery Manor 25 NULL 21 Frost Giants 55 NULL 22 Pet Hotel 20 NULL 23 Sky Racers 35 NULL