Resumo : neste tutorial, mostraremos como excluir dados de várias tabelas usando a instrução MySQL DELETE JOIN .
No tutorial anterior, você aprendeu como excluir linhas de múltiplas tabelas usando:
- Uma única
DELETE
instrução em várias tabelas. - Uma única
DELETE
instrução em várias tabelas relacionadas em que a tabela filha possui umaON DELETE CASCADE
ação referencial para a chave estrangeira .
Este tutorial apresenta uma maneira mais flexível de excluir dados de várias tabelas usando a cláusula INNER JOIN
or LEFT JOIN
com a DELETE
instrução.
MySQL DELETE JOIN com INNER JOIN
O MySQL permite que você use a INNER JOIN
cláusula na DELETE
instrução para excluir linhas de uma tabela que possui linhas correspondentes em outra tabela.
Por exemplo, para excluir linhas de tabelas T1
e T2
que atendam a uma condição especificada, use a seguinte instrução:
DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Observe que você coloca os nomes das tabelas T1
e T2
entre as palavras-chave DELETE
e FROM
. Se você omitir T1
a tabela, a DELETE
instrução excluirá apenas as linhas da T2
tabela. Da mesma forma, se você omitir T2
a tabela, a DELETE
instrução excluirá apenas as linhas da T1
tabela.
A expressão T1.key = T2.key
especifica a condição para correspondência de linhas entre tabelas T1
e T2
que serão excluídas.
A condição da WHERE
cláusula determina as linhas em T1
e T2
que serão excluídas.
MySQL DELETE JOIN com exemplo INNER JOIN
Suponha que temos duas tabelas t1
e t2
com as seguintes estruturas e dados:
DROP TABLE IF EXISTS t1, t2;
CREATE TABLE t1 (
id INT PRIMARY KEY AUTO_INCREMENT
);
CREATE TABLE t2 (
id VARCHAR(20) PRIMARY KEY,
ref INT NOT NULL
);
INSERT INTO t1 VALUES (1),(2),(3);
INSERT INTO t2(id,ref) VALUES('A',1),('B',2),('C',3);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A instrução a seguir exclui a linha com id 1 na t1
tabela e também a linha com ref
1 na t2
tabela usando DELETE...INNER JOIN
a instrução:
DELETE t1,t2 FROM t1
INNER JOIN
t2 ON t2.ref = t1.id
WHERE
t1.id = 1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A instrução retornou a seguinte mensagem:
2 row(s) affected
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Indicou que duas linhas foram excluídas.
MySQL DELETE JOIN com LEFT JOIN
Freqüentemente usamos a LEFT JOIN
cláusula na SELECT
instrução para encontrar linhas na tabela esquerda que possuem ou não linhas correspondentes na tabela direita.
Também podemos usar a LEFT JOIN
cláusula na DELETE
instrução para excluir linhas em uma tabela (tabela esquerda) que não possui linhas correspondentes em outra tabela (tabela direita).
A sintaxe a seguir ilustra como usar DELETE
a instrução with LEFT JOIN
cláusula para excluir linhas da T1
tabela que não possuem linhas correspondentes na T2
tabela:
DELETE T1
FROM T1
LEFT JOIN
T2 ON T1.key = T2.key
WHERE
T2.key IS NULL;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Observe que colocamos T1
tabela apenas após a DELETE
palavra-chave, não ambas T1
e T2
tabelas como fizemos com a INNER JOIN
cláusula.
MySQL DELETE JOIN com exemplo LEFT JOIN
Consulte o seguinte customers
e orders
as tabelas no banco de dados de amostra:
Cada cliente tem zero ou mais pedidos. No entanto, cada pedido pertence a um e apenas um cliente.
Podemos usar DELETE
instrução com LEFT JOIN
cláusula para limpar os dados mestre do cliente. A declaração a seguir remove clientes que não fizeram nenhum pedido:
DELETE customers
FROM customers
LEFT JOIN
orders ON customers.customerNumber = orders.customerNumber
WHERE
orderNumber IS NULL;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Podemos verificar a exclusão descobrindo se existem clientes que não possuem pedidos usando a seguinte consulta:
SELECT
c.customerNumber,
c.customerName,
orderNumber
FROM
customers c
LEFT JOIN
orders o ON c.customerNumber = o.customerNumber
WHERE
orderNumber IS NULL;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A consulta retornou um conjunto de resultados vazio, que é o que esperávamos.
Neste tutorial, você aprendeu como usar a DELETE JOIN
instrução MySQL para excluir dados de duas ou mais tabelas.