Поиск…


Синтаксис

  • 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'


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow