SELECT
HANDLER
INSERT
INSERT DELAYED
UPDATE
DELETE
TRUNCATE
REPLACE
LOAD DATA INFILE
DO
Buy this Reference Manual in softcover from Barnes & Noble!
DELETE
DELETE [LOW_PRIORITY | QUICK] FROM table_name [WHERE where_definition] [ORDER BY ...] [LIMIT rows] или DELETE [LOW_PRIORITY | QUICK] table_name[.*] [,table_name[.*] ...] FROM table-references [WHERE where_definition] oили DELETE [LOW_PRIORITY | QUICK] FROM table_name[.*], [table_name[.*] ...] USING table-references [WHERE where_definition]
Оператор DELETE
удаляет из таблицы table_name
строки, удовлетворяющие заданным в where_definition
условиям, и возвращает число удаленных записей.
Если оператор DELETE
запускается без определения WHERE
, то удаляются все строки. При работе в режиме AUTOCOMMIT
это будет аналогично использованию оператора TRUNCATE
. See section 6.4.7 Синтаксис оператора TRUNCATE
. В MySQL 3.23 оператор DELETE
без определения WHERE
возвратит ноль как число удаленных записей.
Если действительно необходимо знать число удаленных записей при удалении всех строк, и если допустимы потери в скорости, то можно использовать команду DELETE
в следующей форме:
mysql> DELETE FROM table_name WHERE 1>0;
Следует учитывать, что эта форма работает намного медленнее, чем DELETE FROM table_name
без выражения WHERE
, поскольку строки удаляются поочередно по одной.
Если указано ключевое слово LOW_PRIORITY
, выполнение данной команды DELETE
будет задержано до тех пор, пока другие клиенты не завершат чтение этой таблицы.
Если задан параметр QUICK
, то обработчик таблицы при выполнении удаления не будет объединять индексы - в некоторых случаях это может ускорить данную операцию.
В таблицах MyISAM
удаленные записи сохраняются в связанном списке, а последующие операции INSERT
повторно используют места, где располагались удаленные записи. Чтобы возвратить неиспользуемое пространство и уменьшить размер файлов, можно применить команду OPTIMIZE TABLE
или утилиту myisamchk
для реорганизации таблиц. Команда OPTIMIZE TABLE
проще, но утилита myisamchk
работает быстрее. See section 4.5.1 Синтаксис команды OPTIMIZE TABLE
. See section 4.4.6.10 Оптимизация таблиц.
Первый из числа приведенных в начале данного раздела многотабличный формат команды DELETE
поддерживается, начиная с MySQL 4.0.0. Второй многотабличный формат поддерживается, начиная с MySQL 4.0.2.
Идея заключается в том, что удаляются только совпадающие строки из таблиц, перечисленных перед выражениями FROM
или USING
. Это позволяет удалять единовременно строки из нескольких таблиц, а также использовать для поиска дополнительные таблицы.
Символы .*
после имен таблиц требуются только для совместимости с Access:
DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
или
DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
В предыдущем случае просто удалены совпадающие строки из таблиц t1
и t2
.
Выражение ORDER BY
и использование нескольких таблиц в команде DELETE
поддерживается в MySQL 4.0.
Если применяется выражение ORDER BY
, то строки будут удалены в указанном порядке. В действительности это выражение полезно только в сочетании с LIMIT
. Например:
DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp LIMIT 1
Данный оператор удалит самую старую запись (по timestamp
), в которой строка соответствует указанной в выражении WHERE
.
Специфическая для MySQL опция LIMIT
для команды DELETE
указывает серверу максимальное количество строк, которые следует удалить до возврата управления клиенту. Эта опция может использоваться для гарантии того, что данная команда DELETE
не потребует слишком много времени для выполнения. Можно просто повторять команду DELETE
до тех пор, пока количество удаленных строк меньше, чем величина LIMIT
.
Posted by on Friday January 17 2003, @1:45pm | [Delete] [Edit] |
In these section you don't say nothing about the parent - child restrictions (on InnoDB tables), because you cannot delete a parent row only. You have to delete the parent, and child row
Posted by on Tuesday February 4 2003, @8:23am | [Delete] [Edit] |
When you delete a large portion of a MyISAM table, it may be necessary to run an optimize table job afterwards. When the data file becomes fragmented, or when the key distribution data comes out of sync with reality, then you will see large performance drops. Also, disk space will not be freed until you've run optimize.
These are not really bugs, but limitations that you should be aware of when you start deleting large amounts of data from your tables.
Posted by Seth Johnson on Friday February 28 2003, @1:35am | [Delete] [Edit] |
Whew. I just realized how immature this technology is. There is no enforcement of Foreign Key relationships in MySQL. That's a little bit of a problem when I set up my forms to manage my EMPLOYEE table. When I delete an EMPLOYEE, I have to know what all tables might have been created referencing this EMPLOYEE so I can delete those relevant rows. Ugh. I'm trying to write an app and walk away, but if someone else comes along and adds some more tables and stuff, they'll have to also come and modify my EMPLOYEE management interface as well.
Please grow up, MySQL.
Posted by on Sunday March 9 2003, @4:51pm | [Delete] [Edit] |
Seth: Unless I'm making a stupid mistake, MySQL does support cascaded deletes if you use InnoDB tables. See:
http://www.mysql.com/doc/en/SEC457.html
Perhaps this page should reference the link above...
Add your own comment.