Spec-Zone .ru
спецификации, руководства, описания, API

13.2.2. DELETE Синтаксис

DELETE оператор DML, который удаляет строки из таблицы.

Одно-табличный синтаксис:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name    [PARTITION (partition_name,...)]    [WHERE where_condition]    [ORDER BY ...]    [LIMIT row_count]

DELETE оператор удаляет строки из tbl_name и возвращает число удаленных строк. Чтобы проверить число удаленных строк, вызовите ROW_COUNT() функция, описанная в Разделе 12.14, "информационные Функции".

Главные предложения

Условия в дополнительном WHERE пункт идентифицирует который строки удалить. Без WHERE пункт, все строки удаляются.

where_condition выражение, которое оценивает к истине для каждой строки, которая будет удалена. Это определяется как описано в Разделе 13.2.9,"SELECT Синтаксис".

Если ORDER BY пункт определяется, строки удаляются в порядке, который определяется. LIMIT пункт устанавливает границу числа строк, которые могут быть удалены. Эти пункты применяются к единственной таблице, удаляет, но не мультитаблица удаляет.

Многократно-табличный синтаксис:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]    tbl_name[.*] [, tbl_name[.*]] ...    FROM table_references    [WHERE where_condition]

Или:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]    FROM tbl_name[.*] [, tbl_name[.*]] ...    USING table_references    [WHERE where_condition]

Полномочия

Вы нуждаетесь DELETE полномочие на таблице, чтобы удалить строки из этого. Вы нуждаетесь только SELECT полномочие для любых столбцов, которые только читаются, такие как названные в WHERE пункт.

Производительность

Когда Вы не должны знать число удаленных строк, TRUNCATE TABLE оператор является более быстрым способом освободить таблицу чем a DELETE оператор без WHERE пункт. В отличие от этого DELETE, TRUNCATE TABLE не может использоваться в пределах транзакции или если у Вас есть блокировка на таблице. См. Раздел 13.1.33,"TRUNCATE TABLE Синтаксис" и Раздел 13.3.5,"LOCK TABLES и UNLOCK TABLES Синтаксис" .

Скорость удаляет операции, может также влияться факторами, обсужденными в Разделе 8.2.2.3, "Скорость DELETE Операторы".

Гарантировать что данный DELETE оператор не занимает слишком много времени, специфичное для MySQL LIMIT row_count пункт для DELETE определяет максимальное количество строк, которые будут удалены. Если число строк, чтобы удалить больше чем предел, повторитесь DELETE оператор до числа строк, на которые влияют, является меньше чем LIMIT значение.

Подзапросы

В настоящий момент невозможно удалить из таблицы и выбрать из той же самой таблицы в подзапросе.

Разделенные таблицы

Начинание с MySQL 5.6.2, DELETE поддерживает явный выбор раздела, используя PARTITION опция, которая берет список разделенных запятой значений имен одного или более разделов или подразделов (или оба), от которого можно выбрать строки, которые будут отброшены. Игнорируются разделы, не включенные в список. Учитывая разделенную таблицу t с названным разделом p0, выполнение оператора DELETE FROM t PARTITION (p0) имеет тот же самый эффект на таблицу как выполнение ALTER TABLE t TRUNCATE PARTITION (p0); в обоих случаях, все строки в разделе p0 отбрасываются.

PARTITION может использоваться наряду с a WHERE условие, когда условие тестируется только на строках в перечисленных разделах. Например, DELETE FROM t PARTITION (p0) WHERE c < 5 удаляет строки только из раздела p0 для которого условие c < 5 истина; строки в любых других разделах не проверяются и таким образом не влияются DELETE.

PARTITION опция может также использоваться в многократной таблице DELETE операторы. Можно использовать до одной такой опции на таблицу, названную в FROM опция.

См. Раздел 18.5, "Выбор Раздела", для получения дополнительной информации и примеры.

Столбцы автоприращения

Если Вы удаляете строку, содержащую максимальное значение для AUTO_INCREMENT столбец, значение не снова используется для a MyISAM или InnoDB таблица. Если Вы удаляете все строки в таблице с DELETE FROM tbl_name (без a WHERE пункт) в autocommit режим, последовательность запускается для всех механизмов хранения кроме InnoDB и MyISAM. Есть некоторые исключения к этому поведению для InnoDB таблицы, как обсуждено в Разделе 5.4.4,"AUTO_INCREMENT Обработка в InnoDB".

Для MyISAM таблицы, можно определить AUTO_INCREMENT вторичный столбец в ключе многократного столбца. В этом случае повторное использование значений, удаленных из вершины последовательности, происходит даже для MyISAM таблицы. См. Раздел 3.6.9, "Используя AUTO_INCREMENT".

Модификаторы

DELETE оператор поддерживает следующие модификаторы:

Порядок Удаления

Если DELETE оператор включает ORDER BY пункт, строки удаляются в порядке, определенном пунктом. Это полезно прежде всего в соединении с LIMIT. Например, следующий оператор находит строки, соответствующие WHERE пункт, сортирует их timestamp_column, и удаляет первый (самый старый):

DELETE FROM somelog WHERE user = 'jcole'ORDER BY timestamp_column LIMIT 1;

ORDER BY также помогает удалить строки в порядке, требуемом избегать нарушений ссылочной целостности.

Таблицы InnoDB

Если Вы удаляете много строк из большой таблицы, можно превысить табличный размер блокировки для InnoDB таблица. Избежать этой проблемы, или просто минимизировать время, когда таблица остается заблокированной, следующая стратегия (который не использует DELETE вообще), могло бы быть полезным:

  1. Выберите строки, которые не будут удалены в пустую таблицу, у которой есть та же самая структура как исходная таблица:

    INSERT INTO t_copy SELECT * FROM t WHERE ... ;
  2. Использовать RENAME TABLE атомарно переместить исходную таблицу из пути и переименовать копию к настоящему имени:

    RENAME TABLE t TO t_old, t_copy TO t;
  3. Отбросьте исходную таблицу:

    DROP TABLE t_old;

Никакие другие сеансы не могут получить доступ к таблицам, включенным в то время как RENAME TABLE выполняется, таким образом, переименовать работа не подвергается проблемам параллелизма. См. Раздел 13.1.32,"RENAME TABLE Синтаксис".

Таблицы MyISAM

В MyISAM таблицы, удаленные строки сохраняются в связанном списке и последующие INSERT повторное использование операций старые позиции строки. Чтобы исправить неиспользуемое место и уменьшить размеры файла, используйте OPTIMIZE TABLE оператор или myisamchk утилита, чтобы реорганизовать таблицы. OPTIMIZE TABLE легче использовать, но myisamchk быстрее. См. Раздел 13.7.2.4,"OPTIMIZE TABLE Синтаксис", и Раздел 4.6.3, "myisamchk — Утилита Табличного обслуживания MyISAM".

QUICK модификатор влияет, индексируют ли листы, объединяются для, удаляют операции. DELETE QUICK является самым полезным для приложений, где индексируют значения для удаленных строк, заменяются подобным, индексируют значения от строк, вставленных позже. В этом случае дыры, покинутые удаленными значениями, снова используются.

DELETE QUICK не полезно, когда удаленные значения приводят к underfilled, индексируют блоки, охватывающие диапазон, индексируют значения, для которых новые вставки происходят снова. В этом случае, использование QUICK может привести к потраченному впустую пространству в индексировании, которое остается неисправленным. Вот пример такого сценария:

  1. Составьте таблицу, которая содержит индексированный AUTO_INCREMENT столбец.

  2. Вставьте много строк в таблицу. Каждый вставляет результаты в индексировать значение, которое добавляется к высокому классу индексирования.

  3. Удалите блок строк на низком классе использования диапазона столбца DELETE QUICK.

В этом сценарии индексировать блоки, связанные с удаленным, индексируют значения, становятся underfilled, но не объединяются с другим индексировать блоки из-за использования QUICK. Они остаются, underfilled когда новый вставляет, происходят, потому что новые строки не имеют, индексируют значения в удаленном диапазоне. Кроме того они остаются underfilled, даже если Вы позже используете DELETE без QUICK, если некоторые из удаленных не индексируют значения, оказывается, лежат в, индексируют блоки в пределах или смежный с блоками underfilled. Чтобы исправить неиспользованный индексируют пространство при этих обстоятельствах, используют OPTIMIZE TABLE.

Если Вы собираетесь удалить много строк из таблицы, это могло бы быть быстрее, чтобы использовать DELETE QUICK сопровождаемый OPTIMIZE TABLE. Это восстанавливает индексирование вместо того, чтобы выполнить, многие индексируют блочные операции слияния.

Мультитаблица Удаляет

Можно определить многократные таблицы в a DELETE оператор, чтобы удалить строки из одной или более таблиц в зависимости от условия в WHERE пункт. Невозможно использовать ORDER BY или LIMIT в многократной таблице DELETE. table_references пункт перечисляет таблицы, включенные в соединение, как описано в Разделе 13.2.9.2,"JOIN Синтаксис".

Для первого многократно-табличного синтаксиса, только соответствуя строки от таблиц, перечисленных перед FROM пункт удаляется. Для второго многократно-табличного синтаксиса, только соответствуя строки от таблиц, перечисленных в FROM пункт (прежде, чем USING пункт), удаляются. Эффект состоит в том, что можно удалить строки из многих таблиц одновременно и иметь дополнительные таблицы, которые используются только для того, чтобы искать:

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3WHERE t1.id=t2.id AND t2.id=t3.id;

Или:

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3WHERE t1.id=t2.id AND t2.id=t3.id;

Эти операторы используют все три таблицы, ища строки, чтобы удалить, но удалить соответствие строк только от таблиц t1 и t2.

Предыдущее использование в качестве примера INNER JOIN, но многократная таблица DELETE операторы могут использовать другие типы соединения, разрешенного в SELECT операторы, такой как LEFT JOIN. Например, чтобы удалить строки, которые существуют в t1 у этого нет никакого соответствия в t2, используйте a LEFT JOIN:

DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;

Разрешения на синтаксис .* после каждого tbl_name для совместимости с Доступом.

Если Вы используете многократную таблицу DELETE включение оператора InnoDB таблицы, для которых есть ограничения внешнего ключа, оптимизатор MySQL, могли бы таблицы процессов в порядке, который отличается от того из их родительского/дочернего отношения. В этом случае оператор приводит к сбою и откатывает. Вместо этого следует удалить из единственной таблицы и положиться ON DELETE возможности это InnoDB обеспечивает, чтобы заставить другие таблицы быть измененными соответственно.

Отметить

Если Вы объявляете псевдоним для таблицы, следует использовать псевдоним, обращаясь к таблице:

DELETE t1 FROM test AS t1, test2 WHERE ...

Таблица искажает в многократной таблице DELETE должен быть объявлен только в table_references часть оператора. В другом месте ссылки псевдонима разрешаются, но не объявления альтернативного имени.

Корректный:

DELETE a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2WHERE a1.id=a2.id;DELETE FROM a1, a2 USING t1 AS a1 INNER JOIN t2 AS a2WHERE a1.id=a2.id;

Неправильный:

DELETE t1 AS a1, t2 AS a2 FROM t1 INNER JOIN t2WHERE a1.id=a2.id;DELETE FROM t1 AS a1, t2 AS a2 USING t1 INNER JOIN t2WHERE a1.id=a2.id;