MySQL
УДАЛЯТЬ
Поиск…
Синтаксис
- DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table [WHERE conditions] [выражение ORDER BY [ASC | DESC]] [LIMIT number_rows]; /// Синтаксис для строки (-ов) удаления из одной таблицы
параметры
параметр | подробности |
---|---|
НИЗКИЙ ПРИОРИТЕТ | Если предоставлен LOW_PRIORITY , удаление будет задерживаться до тех пор, пока в таблице не будет LOW_PRIORITY процессов |
ИГНОРИРУЙТЕ | Если предоставляется IGNORE , все ошибки, возникающие во время удаления, игнорируются |
Таблица | Таблица, из которой вы собираетесь удалять записи |
ГДЕ условия | Условия, которые должны быть выполнены для записей, подлежащих удалению. Если условий не предусмотрено, все записи из таблицы будут удалены |
Выражение ORDER BY | Если предоставляется ORDER BY , записи будут удалены в указанном порядке |
ПРЕДЕЛ | Он контролирует максимальное количество записей для удаления из таблицы. Учитывая, что number_rows будет удален. |
Удалить с предложением Where
DELETE FROM `table_name` WHERE `field_one` = 'value_one'
Это приведет к удалению всех строк из таблицы, в которой содержимое поля field_one
для этой строки соответствует значению value_one,
Предложение WHERE
работает так же, как выбор, поэтому могут использоваться такие вещи, как >
, <
, <>
или LIKE
.
Примечание. В запросе удаления необходимо использовать условные предложения (WHERE, LIKE). Если вы не используете условные предложения, все данные из этой таблицы будут удалены.
Удалить все строки из таблицы
DELETE FROM table_name ;
Это удалит все, все строки из таблицы. Это самый простой пример синтаксиса. Он также показывает, что операторы DELETE
действительно должны использоваться с особой осторожностью, поскольку они могут удалить таблицу, если WHERE
опущено.
Удаление исключений
DELETE FROM `table_name` WHERE `field_one` = 'value_one' LIMIT 1
Это работает так же, как пример «Удалить с предложением», но он остановит удаление после ограниченного количества строк.
Если вы ограничиваете строки для удаления таким образом, имейте в виду, что он удалит первую строку, соответствующую критериям. Возможно, это не тот, который вы ожидаете, так как результаты могут возвращаться несортированными, если они явно не упорядочены.
Удаление нескольких таблиц
Оператор DELETE
MySQL может использовать конструкцию JOIN
, позволяющую также указать, какие таблицы удалить из. Это полезно для предотвращения вложенных запросов. Учитывая схему:
create table people
( id int primary key,
name varchar(100) not null,
gender char(1) not null
);
insert people (id,name,gender) values
(1,'Kathy','f'),(2,'John','m'),(3,'Paul','m'),(4,'Kim','f');
create table pets
( id int auto_increment primary key,
ownerId int not null,
name varchar(100) not null,
color varchar(100) not null
);
insert pets(ownerId,name,color) values
(1,'Rover','beige'),(2,'Bubbles','purple'),(3,'Spot','black and white'),
(1,'Rover2','white');
Я бы | название | Пол |
---|---|---|
1 | Кэти | е |
2 | Джон | м |
3 | Павел | м |
4 | Ким | е |
Я бы | OwnerId | название | цвет |
---|---|---|---|
1 | 1 | пират | бежевый |
2 | 2 | Пузыри | пурпурный |
4 | 1 | Rover2 | белый |
Если мы хотим удалить домашних животных Пола, заявление
DELETE p2
FROM pets p2
WHERE p2.ownerId in (
SELECT p1.id
FROM people p1
WHERE p1.name = 'Paul');
можно переписать как:
DELETE p2 -- remove only rows from pets
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
1 строка удалена
Пятно удалено из домашних животных
p1
и p2
являются псевдонимами для имен таблиц, особенно полезными для длинных имен таблиц и простоты чтения.
Чтобы удалить и человека, и животное:
DELETE p1, p2 -- remove rows from both tables
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
Удалено 2 строки
Пятно удалено из домашних животных
Павел исключен из Людей
внешние ключи
Когда оператор DELETE включает таблицы с привязкой ключа foreing, оптимизатор может обрабатывать таблицы в порядке, который не следует за отношением. Добавление, например, внешнего ключа к определению домашних pets
ALTER TABLE pets ADD CONSTRAINT `fk_pets_2_people` FOREIGN KEY (ownerId) references people(id) ON DELETE CASCADE;
двигатель может попытаться удалить записи от people
до pets
, что приведет к следующей ошибке:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`pets`, CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`ownerId`) REFERENCES `people` (`id`))
Решением в этом случае является удаление строки от people
и использование возможностей ON DELETE
от InnoDB
для распространения удаления:
DELETE FROM people
WHERE name = 'Paul';
Удалено 2 строки
Павел исключен из Людей
Пятно удаляется по каскаду от домашних животных
Еще одно решение - временно отключить проверку входящих ключей:
SET foreign_key_checks = 0;
DELETE p1, p2 FROM people p1 JOIN pets p2 ON p2.ownerId = p1.id WHERE p1.name = 'Paul';
SET foreign_key_checks = 1;
Основное удаление
DELETE FROM `myTable` WHERE `someColumn` = 'something'
Предложение WHERE
является необязательным, но без него все строки удаляются.
УДАЛИТЬ ПРОГРАММЫ
TRUNCATE tableName;
Это приведет к удалению всех данных и сбросу индекса AUTO_INCREMENT
. Это намного быстрее, чем DELETE FROM tableName
на огромном наборе данных. Это может быть очень полезно при разработке / тестировании.
Когда вы усекаете таблицу, SQL-сервер не удаляет данные, он отбрасывает таблицу и воссоздает ее, тем самым освобождая страницы, поэтому есть возможность восстановить усеченные данные до перезаписанных страниц. (Пространство не может быть немедленно innodb_file_per_table=OFF
для innodb_file_per_table=OFF
.)
Multi-table DELETE
MySQL позволяет указать, из какой таблицы должны быть удалены соответствующие строки
-- remove only the employees
DELETE e
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'
-- remove employees and department
DELETE e, d
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'
-- remove from all tables (in this case same as previous)
DELETE
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'