Удаление строк: DELETE
DELETE удаляет строки из таблицы. Ava Green попросила магазин убрать её отзывы:
DELETE FROM reviews
WHERE customer_id = 5;После DELETE FROM идёт таблица, а WHERE говорит, какие строки удалить. На вкладке «Результаты» будет Изменено строк: 2, потому что Ava написала два отзыва, а запрос покажет, что отзывов осталось 23 из 25:
SELECT COUNT(*) AS reviews
FROM reviews;| reviews |
|---|
| 23 |
DELETE всегда удаляет строки целиком, поэтому списка столбцов у него нет: DELETE title FROM games — ошибка, и DELETE * FROM games, который вы можете встретить в других базах данных, тоже. Чтобы убрать из строки только одно значение, используйте UPDATE: SET city = NULL.
И, как и UPDATE, DELETE без WHERE удаляет все строки: после DELETE FROM reviews; таблица пуста. Она по-прежнему существует, со своими столбцами, но строк в ней нет. Поэтому сначала проверяйте WHERE запросом SELECT, как вы уже научились.
Некоторые строки удалить нельзя. Попробуйте удалить возвращённый заказ 7:
DELETE FROM orders
WHERE id = 7;Error on line 1: FOREIGN KEY constraint failedСтрока order_items с заказом 7 указывает на заказ через внешний ключ order_id. Если бы заказ исчез, позиция указывала бы на несуществующий заказ. База данных защищает вас от этого: она отказывается удалять строку, на которую указывает другая строка. В её сообщении не сказано, какая это строка, так что искать придётся самим. Подумайте, в каких таблицах есть внешний ключ на эту.
Решение — сначала удалить строки, которые на неё указывают, а потом саму строку:
DELETE FROM order_items
WHERE order_id = 7;
DELETE FROM orders
WHERE id = 7;Порядок важен: сначала строки, которые указывают, и в конце та, на которую они указывают. Та же защита действует и для UPDATE: он тоже не может направить внешний ключ на несуществующую строку.
Задание
- 1
Robot Rebellion (ID 18) отменили: она никогда не выйдет. Удалите её из
games, а ниже покажите ID и название игр, которые ещё не вышли (у нихreleasedравноNULL), отсортировав их по ID. Осталась только одна:id title 19 Mystery Manor - 2
Isla Young (клиент 9) попросила магазин удалить её аккаунт вместе со всем, что к нему относится. Удалите её из
customers, но сначала удалите всё, что на неё указывает: её отзывы, её заказы, а перед заказами — их позиции. (Её заказы можно найти на вкладке «Таблицы» или поручить поиск подзапросу.) Затем покажите ID и имя клиентов с ID от 8 до 10, отсортировав их по ID:id name 8 Leo Walker 10 Oscar King - 3
Наконец, убедитесь, что больше ничего не пропало: покажите, сколько осталось заказов, позиций заказов и отзывов, одной строкой со столбцами
orders,itemsиreviews. Каждый столбец может быть подзапросом сCOUNT(*), а запросу без собственной таблицыFROMне нужен. По сравнению с началом должны исчезнуть один заказ, одна позиция и один отзыв:orders items reviews 29 41 24