Поиск

Операторы манипуляции данными

. Синтаксис DELETE
Однотабличный синтаксис:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM имя_таблицы[WHERE определение_where] [ORDER BY .. . ] [LIMIT количество_строк]
Многотабличный синтаксис:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
имя_ та блицы [. *] [, имя_таблицы [. *] . ..] FROM табличные_ссылки [WHERE определение_мЬеге]
Или:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM имя_ таблицы[. *] [, имя_та блицы[. *] .. . ]
USING табличные_ссылки
[WHERE
DELETE удаляет строки из таблицы имя_таблицы, удовлетворяющие условию опреде-ление_мЬеге и возвращает количество удаленных строк.
В случае выдачи оператора DELETE без конструкции WHERE удаляются все строки. Ес­ли вам не нужно знать количество удаленных строк, то это можно сделать быстрее с по­мощью оператора TRUNCATE TABLE. См. раздел 6.1.9.
В MySQL 3.23 оператор DELETE без конструкции WHERE возвращает ноль.
В версии MySQL 3.23, если вы действительно хотите знать количество удаленных записей, и согласны на некоторое снижение производительности, можете использовать DELETE с конструкцией WHERE, условие которой является истинным для каждой записи.

Например:
mysql> DELETE FROM имя_таблицыWHERE l>0;
Это гораздо медленнее, чем DELETE FROM имя_таблицы без конструкции WHERE, по­скольку строки удаляются по одной.

Если вы удаляете строку, содержащую максимальное значение столбца AUTO_INCREMENT, это значение будет повторно использовано в таблицах ISAM и BDB, но не в таблицах MyISAM или innoDB. Если вы удаляете все строки таблицы оператором DELETE FROM имя_таблицы (без конструкции WHERE) в режиме AUTOCOMMIT, последовательность стартует для всех типов таблиц, кроме InnoDB и (начиная с MySQL 4.0) MyISAM. Сущест­вуют некоторые исключения упомянутого поведения, которые подробно рассматрива­ются в главе, посвященной InnoDB, книги MySQL. Руководство администратора (М. : Издательский дом "Вильяме", 2005, ISBN 5-8459-0805-1).
Для таблиц MyISAM и BDB можно объявить вторичный столбец AUTO_INCREMENT в со­ставном ключе. В этом случае повторное использование значений, удаленных с верши­ны последовательности, происходит даже для таблиц MyISAM.
Оператор DELETE поддерживает следующие модификаторы:

  1. Если указать ключевое слово LOW_PRIORITY, выполнение DELETE откладывается до тех пор, пока другие клиенты не завершат чтение таблицы.
  2. Для таблиц MyISAM, если указано ключевое слово QUICK, механизм хранения необъединяет листья индекса в процессе удаления, что ускоряет некоторые типы операций DELETE.
  3. Ключевое слово IGNORE заставляет MySQL игнорировать все ошибки в процессе удаления строк. (Ошибки, обнаруженные на стадии синтаксического анализа, обрабатываются обычным образом.) Об ошибках, которые игнорируются вследствие применения этой опции, сообщается в виде предупреждений. Эта опция появилась в MySQL 4.1.1.

На скорость выполнения операции удаления могут также повлиять факторы, которые обсуждаются в главе, посвященной оптимизации, книги MySQL. Руководство админи­стратора.
В таблицах MyISAM удаленные записи помещаются в связный список, и последующий оператор INSERT повторно использует старые позиции записей. Чтобы вернуть неис­пользуемое пространство и уменьшить размеры файлов, применяйте оператор OPTIMIZE TABLE или утилиту myisamchk для реорганизации таблиц. OPTIMIZE TABLE проще, но myisamchk быстрее. См. раздел Неявные изменения спецификаций столбцов.
Специфичная для MySQL опция LIMIT количество_строк оператора DELETE сообщает серверу максимальное число удаляемых строк перед возвратом управления клиенту. Это применяется для того, чтобы гарантировать, что выполнение какого-то особенного опе­ратора DELETE не займет слишком много времени. Вы можете просто повторять этот оператор DELETE до тех пор, пока количество удаленных строк не окажется меньше, чем указано в значении LIMIT.
Если оператор DELETE включает конструкцию ORDER BY, то строки удаляются в ука­занном порядке. Это действительно удобно только в сочетании с опцией LIMIT. Напри­мер, следующий оператор находит строки, удовлетворяющие условию WHERE, сортирует их по порядку timestamp и удаляет первую (наиболее старую) из них:

DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp LIMIT 1
ORDER BY может использоваться вместе с DELETE, начиная с MySQL 4.0.0.
Начиная с MySQL 4.0, в операторе DELETE можно указывать множество таблиц, что­бы удалять строки из одной или более таблиц, в зависимости от определенного условия во множестве таблиц. Однако в многотабличном DELETE нельзя указывать ORDER BY или
LIMIT.

Первый многотабличный синтаксис DELETE поддерживается, начиная с MySQL 4.0.0. Второй поддерживается, начиная с MySQL 4.O.2. Часть табличные_ссылки перечисляет таблицы, участвующие в соединении. Этот синтаксис подробно описан в разделе Синтаксис JOIN.
При использовании первого синтаксиса удаляются только соответствующие строки из таблиц, перечисленных перед конструкцией FROM. При втором синтаксисе удаляются соответствующие строки из таблиц, перечисленных в конструкции FROM (перед USING).
Эффект заключается в том, что вы можете удалять строки из многих таблиц одно­временно и также использовать дополнительные таблицы для поиска:
DELETE tl,t2 FROM tl,t2,t3 WHERE tl.id=t2.id AND t2.id=t3.id; или
DELETE FROM tl,t2 USING tl,t2,t3 WHERE tl.id=t2.id AND t2.id=t3.id;
Эти операторы используют три таблицы для поиска строк, подлежащих удалению, но удаляют подходящие строки только в двух таблицах -tlи t2.
Примеры показывают вложенные соединения, используя операцию запятой, но мно­готабличные операторы DELETE могут также применять любой тип соединения, допус­тимый для операторов SELECT, такой, например, как LEFT JOIN.
Синтаксис допускаетf.*' после имен таблиц для достижения совместимости с Access.
Если вы используете многотабличный оператор DELETE с таблицами InnoDB, у кото­рых есть ограничения внешних ключей, оптимизатор MySQL может обрабатывать таб­лицы в порядке, отличающемся от заданного их отношением родительский/дочерний. В этом случае оператор завершается ошибкой и транзакция откатывается. Вместо этого удалите нужные записи из одной таблицы, и рассчитывайте на возможность ON DELETE, предоставляемую InnoDB, чтобы соответствующим образом модифицировать зависимые таблицы.
На заметку!
В MySQL 4.0 для удаления записей вы должны обращаться к таблицам по их реальным именам. В MySQL 4.1 для обращения к именам таблиц необходимо использовать псевдонимы (если они указаны):
В MySQL 4.0:
DELETE test FROM test AS tl, test2 WHERE ...
В MySQL 4.1:
DELETE tl FROM test AS tl, test2 WHERE ...
Причина того, что это не было реализовано в 4.0, состоит в том, что мы не хотели разрушать приложения MySQL 4.0, которые использовали старый синтаксис.