Sintaxe DELETE
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
. Leia "Sintaxe TRUNCATE
". No MariaDB 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 "Performance das Consultas que Utilizam DELETE
".
A opção IGNORE
faz com que o MariaDB 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 "Sintaxe de OPTIMIZE TABLE
" e "Otimização de Tabelas".
O primeiro formato de delção de multi-tabelas é suportado a partir do MariaDB 4.0.0. O segundo formato de deleção multi-tabelas é suportado a partir do MariaDB 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 MariaDB 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 MariaDB 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 MariaDB 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
.