Spec-Zone .ru
спецификации, руководства, описания, API
|
DELETE
оператор DML, который удаляет строки из таблицы.
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROMtbl_name
[PARTITION (partition_name
,...)] [WHEREwhere_condition
] [ORDER BY ...] [LIMITrow_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
[.*]] ... FROMtable_references
[WHEREwhere_condition
]
Или:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROMtbl_name
[.*] [,tbl_name
[.*]] ... USINGtable_references
[WHEREwhere_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
(без a tbl_name
WHERE
пункт) в
autocommit
режим, последовательность запускается для всех механизмов хранения кроме InnoDB
и
MyISAM
. Есть некоторые исключения к этому поведению для InnoDB
таблицы, как обсуждено в Разделе 5.4.4,"AUTO_INCREMENT
Обработка в InnoDB
".
Для MyISAM
таблицы, можно определить AUTO_INCREMENT
вторичный столбец в ключе многократного столбца. В этом случае повторное использование значений, удаленных из
вершины последовательности, происходит даже для MyISAM
таблицы. См. Раздел
3.6.9, "Используя AUTO_INCREMENT
".
DELETE
оператор поддерживает следующие модификаторы:
Если Вы определяете LOW_PRIORITY
, сервер задерживает
выполнение DELETE
пока никакие другие клиенты не читают из таблицы. Это влияет
только на механизмы хранения, которые используют только блокировку на уровне таблицы (такой как MyISAM
, MEMORY
, и MERGE
).
Для MyISAM
таблицы, если Вы используете QUICK
ключевое слово, механизм хранения не объединяется, индексируют листы во
время, удаляют, который может убыстриться, некоторые виды удаляют операции.
IGNORE
ключевое слово заставляет MySQL игнорировать все
ошибки во время процесса удаления строк. (Ошибки, с которыми встречаются во время этапа парсинга,
обрабатываются обычным способом.) Ошибки, которые игнорируются из-за использования IGNORE
возвращаются как предупреждения.
Если DELETE
оператор включает ORDER BY
пункт, строки
удаляются в порядке, определенном пунктом. Это полезно прежде всего в соединении с LIMIT
. Например, следующий оператор находит строки, соответствующие WHERE
пункт, сортирует их timestamp_column
, и
удаляет первый (самый старый):
DELETE FROM somelog WHERE user = 'jcole'ORDER BY timestamp_column LIMIT 1;
ORDER BY
также помогает удалить строки в порядке, требуемом избегать нарушений
ссылочной целостности.
Если Вы удаляете много строк из большой таблицы, можно превысить табличный размер блокировки для InnoDB
таблица. Избежать этой проблемы, или просто минимизировать время, когда
таблица остается заблокированной, следующая стратегия (который не использует DELETE
вообще), могло бы быть полезным:
Выберите строки, которые не будут удалены в пустую таблицу, у которой есть та же самая структура как исходная таблица:
INSERT INTO t_copy SELECT * FROM t WHERE ... ;
Использовать RENAME
TABLE
атомарно переместить исходную таблицу из пути и переименовать копию к настоящему имени:
RENAME TABLE t TO t_old, t_copy TO t;
Отбросьте исходную таблицу:
DROP TABLE t_old;
Никакие другие сеансы не могут получить доступ к таблицам, включенным в то время как RENAME TABLE
выполняется, таким образом, переименовать работа не подвергается
проблемам параллелизма. См. Раздел 13.1.32,"RENAME
TABLE
Синтаксис".
В 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
может привести к потраченному впустую пространству
в индексировании, которое остается неисправленным. Вот пример такого сценария:
Составьте таблицу, которая содержит индексированный AUTO_INCREMENT
столбец.
Вставьте много строк в таблицу. Каждый вставляет результаты в индексировать значение, которое добавляется к высокому классу индексирования.
Удалите блок строк на низком классе использования диапазона столбца 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;