Nossa jornada para o MySQL começou com CREATE TABLE seguido por INSERT. Hoje, estamos prosseguindo com a instrução MySQL DELETE. É quase tão comum quanto a instrução UPDATE do MySQL.
Como você está familiarizado com o T-SQL DELETE, o objetivo é torná-lo mais produtivo usando a sintaxe do MySQL. Existem pequenas diferenças nessas instruções DELETE, mas não há nada que você não possa lidar. Vamos começar.
Preparando os dados de amostra
Uma das necessidades mais comuns é a tarefa de exclusão de linha do MySQL. Vamos examiná-lo aqui, mas primeiro temos que preparar nossa área de trabalho. Para excluir quaisquer registros, primeiro precisamos tê-los. Assim, vamos construir um banco de dados no MySQL.
Estou me sentindo nostálgico com as séries de TV dos anos 80, então vou usar episódios de MacGyver e Quantum Leap para dados de amostra. Eu tenho o arquivo final do Excel para importar os dados para um novo banco de dados. Este arquivo tem 2 planilhas chamadas Títulos e Episódios . Vamos importá-los para duas tabelas.
Antes de importar dados, devemos criar um banco de dados chamado tv-series com duas tabelas chamadas Títulos e Episódios . O trabalho de criação de tabela do MySQL é elementar com a ferramenta adequada. Estou usando o dbForge Studio para MySQL e as Figuras 1 e 2 a seguir exibem a estrutura visual da tabela do meu banco de dados apresentada por essa ferramenta.
O script para as tabelas está abaixo:
CREATE DATABASE IF NOT EXISTS `tv-series`;
USE `tv-series`;
CREATE TABLE `tv-series`.titles (
TitleID int NOT NULL AUTO_INCREMENT,
Title varchar(50) DEFAULT NULL,
`From` int DEFAULT NULL,
`To` int DEFAULT NULL,
PRIMARY KEY (TitleID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 3,
AVG_ROW_LENGTH = 8192,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;
CREATE TABLE `tv-series`.episodes (
EpisodeID int NOT NULL AUTO_INCREMENT,
TitleID int DEFAULT NULL,
EpisodeTitle varchar(100) DEFAULT NULL,
AirDate date DEFAULT NULL,
Synopsis text DEFAULT NULL,
EpisodeNo int NOT NULL,
SeasonNo int NOT NULL,
PRIMARY KEY (EpisodeID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 160,
AVG_ROW_LENGTH = 414,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE `tv-series`.episodes
ADD INDEX IDX_episodes_TitleID (TitleID);
Após criar o banco de dados e as tabelas, podemos importar nossos dados do arquivo Excel.
A ferramenta mais simples e poderosa que usei para importar arquivos do Excel para o MySQL é o dbForge Studio for MySQL. Aprecio especialmente a adição de uma nova coluna como chave primária na tabela de destino. Além disso, o formato de data e hora de detecção automática é um ótimo suporte. Ele converte datas com um tipo de dados de texto e formatos de data estranhos sem aborrecimentos.
Como vamos comparar a sintaxe do MySQL com o T-SQL, você também pode importar o arquivo Excel para um novo banco de dados no SQL Server. Em seguida, use os mesmos nomes de banco de dados e tabelas do MySQL.
Mais informações
- Ferramenta de importação e exportação MySQL no dbForge Studio para MySQL
1. Excluir todos os dados da tabela
Primeiro, o mais fácil. Vamos tentar fazer backup dos Episódios tabela e, em seguida, exclua os registros do backup. Vamos realizar a operação padrão de exclusão de todas as linhas do MySQL que você pode precisar fazer em diferentes situações.
CREATE TABLE episodes_backup AS
SELECT * FROM episodes;
DELETE FROM episodes_backup;
Como você vê, a sintaxe é a mesma do T-SQL. A consulta excluirá todos os registros no episodes_backup tabela.
Algumas notas para você:
- Se você precisar excluir várias linhas ou todas as linhas, TRUNCATE TABLE é mais rápido que DELETE sem uma cláusula WHERE. Isso vale tanto para o MySQL quanto para o SQL Server.
- Executar o código acima no MySQL Workbench acionará um Código de erro 1175 . Não é permitido porque o MySQL Workbench assume como padrão a atualização do modo de segurança. Assim, uma exclusão ou atualização de uma tabela sem uma cláusula WHERE não é permitida. No entanto, você pode desativar esse recurso em Preferências .
2. Excluir WHERE no MySQL
O segundo ponto é sobre o uso de DELETE com uma condição, a operação delete from select do MySQL. Dessa forma, você pode excluir um ou mais registros em uma única instrução, mas não todos. Por exemplo, exclua a primeira linha ou outras linhas/linhas específicas. E se você estiver procurando uma maneira de evitar registros duplicados no SQL? Usar a condição WHERE seria a solução.
Novamente, a sintaxe é a mesma no T-SQL:
-- Delete 1 record using an equality operator
DELETE FROM episodes
WHERE EpisodeID = 150;
-- Delete 3 records using IN
DELETE FROM episodes
WHERE EpisodeID IN (151,152,153);
Nada de extraordinário aqui, mas a próxima seção será diferente.
3. LIMITE DE EXCLUSÃO do MySQL
LIMITE? Qual LIMITE?
LIMIT é equivalente a TOP em T-SQL. Antes de termos um exemplo DELETE, vamos consultar os registros que vamos excluir. Confira o código abaixo:
SELECT * FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Aqui está o seu LIMITE. Isso resultará em 2 registros conforme mostrado na Figura 3 para a visualização do cartão no dbForge Studio for MySQL:
Agora, vamos tentar excluí-los. Dê uma olhada no exemplo abaixo:
DELETE FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Antes de excluir 2 episódios, o MySQL consultou todos os episódios de 1987. Em seguida, classificou-os em números de temporada e episódio. Por fim, limitou os resultados a 2 registros. Também é um método adequado quando precisamos excluir linhas duplicadas. Ele nos permite especificar as condições de exclusão e garantir que não excluiremos nada necessário (mas fazer um backup ainda garantiria a segurança dos dados).
Existe um equivalente T-SQL? Você acha que isso vai funcionar?
DELETE TOP (2) FROM episodes
WHERE year(AirDate) = 2020
ORDER BY SeasonNo, EpisodeNo
GO
Se você colar o código acima no SQL Server Management Studio, obterá linhas onduladas na cláusula ORDER BY. No entanto, TOP é permitido.
No entanto, se você remover a cláusula ORDER BY, sua consulta excluirá 2 registros aleatórios. Finalmente, o código acima não será executado conforme o esperado.
Para ter o mesmo resultado que no MySQL, você precisa do seguinte código:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
É um pouco mais longo no T-SQL do que no MySQL. Mas há mais.
4. MySQL DELETE com JOIN
Outra maneira de excluir registros é usá-lo com um JOIN que filtrará os registros que você deseja excluir. Como muitos usuários definem, é a tarefa de junção de exclusão do MySQL. Nada parece diferente quando você não está usando um alias de tabela. Verifique o exemplo abaixo:
DELETE episodes
FROM episodes
INNER JOIN titles ON titles.TitleID = episodes.TitleID
WHERE titles.TitleID = 3
AND episodes.SeasonNo = 3;
Isso também funcionará em T-SQL. Mas se usarmos um alias de tabela como este:
DELETE episodes
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
O MySQL lançará um erro. A sintaxe correta está abaixo:
DELETE e
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
Observe a diferença!
5. Excluir subconsulta no MySQL
Finalmente, tentamos usar subconsultas. É uma maneira diferente de filtrar os registros que você deseja excluir. Você já viu o exemplo anterior, mas vamos tê-lo novamente:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
Esta é uma sintaxe perfeitamente válida em T-SQL. Mas vai funcionar no MySQL? Vamos mudar um pouco:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2);
Ops! Parece que batemos na parede. Veja o que o MySQL diz:
Esta versão do MySQL ainda não suporta a subconsulta 'LIMIT &IN/ALL/ANY/SOME'
E se removermos a palavra-chave LIMIT? Ele aciona outro erro:
Você não pode especificar os 'episódios' da tabela de destino para uma atualização na cláusula FROM.
Existe uma solução alternativa? Alterar o código para uma subconsulta aninhada funcionará bem:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM (SELECT EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 5) AS T)
Isso deve resolver. Mas vamos a um exemplo mais sensato:
DELETE FROM episodes
WHERE TitleID IN
(SELECT TitleID FROM titles
WHERE `From` BETWEEN 1995 AND 2000);
Agora, qual é o grande problema com esses exemplos? Vamos ver:
- O MySQL não aceitará a instrução DELETE com um filtro de subconsulta usando a palavra-chave LIMIT. Ainda não.
- O MySQL não aceitará DELETE da tabela de destino igual à tabela de subconsulta que a filtra.
[id do formulário de envio=”13566″]
Conclusão
Até agora tudo bem. Você tem três comparações de sintaxe DELETE para MySQL e T-SQL. Espero que a terceira parte também seja útil para você no futuro.
Esta postagem destacou a sintaxe do MySQL ao excluir
- Todos os registros,
- 1 ou mais registros com uma cláusula WHERE,
- Usando LIMIT,
- Usando JOIN,
- Usando subconsultas.
Você pode ver facilmente as formas de desempenho da tarefa de exclusão da coluna do MySQL ou excluir qualquer linha, várias linhas e registros específicos por condições.
Se você gostou deste post, sinta-se à vontade para compartilhá-lo em suas redes sociais favoritas. Deixe-nos também saber o que você pensa na seção de comentários abaixo.