DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name [WHERE definição_where] [ORDER BY ...] [LIMIT row_count] ou DELETE [LOW_PRIORITY] [QUICK] [IGNORE] table_name[.*] [, table_name[.*] ...] FROM tabelas-referentes [WHERE definição_where] ou DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM nome_tabela[.*] [, nome_tabela[.*] ...] USING tabelas-referentes [WHERE definição_where]
DELETE
deleta linhas de
nome_tabela
que satisfaçam a condição dada
por definição_where
, e retorna o número de
registros deletados.
Se você exeecutar um DELETE
sem cláusula
WHERE
, todas as linhas são deletadas. Se
você o fizer no modo AUTOCOMMIT
, isto irá
funcionar como TRUNCATE
. See
Secção 6.4.6, “Sintaxe TRUNCATE
”. No MySQL 3.23,
DELETE
sem uma cláusula
WHERE
retornará zero como o número de
registros afetados.
Se você realmente quiser saber quantos registros são deletados
quando você deletar todas as linhas mesmo sofrendo uma com a
queda da velocidade, você pode utilizar uma instrução
DELETE
desta forma:
mysql> DELETE FROM nome_tabela WHERE 1>0;
Note que isto é muito mais lento que DELETE FROM
nome_tabela
sem cláusula WHERE
,
pois ele deleta uma linha de cada vez.
Se você especificar a palavra-chave
LOW_PRIORITY
, a execução do
DELETE
é atrasda até que nenhum outro
cliente esteja lendo da tabela.
Para tabelas MyISAM
, Se você especificar a
palavra QUICK
, o mecanismo de armazenamento
não irá fundir os índices excluídos durante a deleção, o
que pode aumentar a velocidade de certos tipos de deleção.
A velocidade das operações de deleção também pode ser
afetadas pelos fatores discutidos em
Secção 5.2.12, “Performance das Consultas que Utilizam DELETE
”.
A opção IGNORE
faz com que o MySQL ignore
todos os erros durente o processo de deleção dos registros.
Erros encontrados durante o estágio de análise são
processados da maneira comum. Erros que são ignorados devido ao
uso desta opção são retornados como aviso. Esta opção
aparece pela primeira vez na versão 4.1.1.
Em tabelas MyISAM
, registros deletados são
mantidos em uma lista encadeada e operções
INSERT
subsequentes reutilizam posições de
registros antigos. Para recuperar espeços não utilizados e
reduzir o tamanho do arquivo, utilize a instrução
OPTIMIZE TABLE
ou o utiliztário
myisamchk
para reorganizar as tabelas.
OPTIMIZE TABLE
é mais fácil, mas
myisamchk
é mais rápido. Veja
Secção 4.6.1, “Sintaxe de OPTIMIZE TABLE
” e
Secção 4.5.6.10, “Otimização de Tabelas”.
O primeiro formato de delção de multi-tabelas é suportado a partir do MySQL 4.0.0. O segundo formato de deleção multi-tabelas é suportado a partir do MySQL 4.0.2.
A idéia é que apenas linhas coincidentes da tabelas listadas
antes de
FROM
ou antes da cláusula
USING
são deletadas. O efeito é que você
pode deletar l;inhas de muitas tabelas ao mesmo tempo e também
ter tabelas adicionais que são utilizadas para busca.
O .*
depois do nome da tabela existe apenas
para ser compatível com o Access
:
DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id ou DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
No cso acima nós deletamos linhas coincidente apenas na tabela
t1
e t2
.
O exemplo mostra um inner join usando o operador de vírgula,
mas instruções UPDATE
multi-tabelas podem
usar qualquer tipo de join permitida na instrução
SELECT
, como LEFT JOIN
.
Se uma cláusula ORDER BY
é utilizada
(disponível no MySQL 4.0.0), as linhas serão deletadas naquela
ordem. Isto só é útil se usado em conjunto com
LIMIT
. Por exemplo:
DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp LIMIT 1
Isto irá deletar as entradas antigas (por
timestamp
) onde as linhas casam com a
cláusula WHERE
.
A opção específica do MySQL LIMIT
row_count
para DELETE
diz ao
servidor o número máximo de linhas a serem deletadas antes do
controle retornar ao cliente. Isto pode ser usado para assegurar
que uma comando DELETE
específico mão
tomará muito tempo, Você pode simplesmente repetir o comando
DELETE
até que o número de linhas afetadas
seja menor que o valor LIMIT
.
No MySQL 4.0, você pode especificar múltiplas tabelas na
instrução DELETE
para deletar linhas de uma
ou mais tabelas dependendo de uma condição particular em
várias tabelas. No entanto você não pode utilizar
ORDER BY
ou LIMIT
em uma
multi-tabela DELETE
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.