Aqui está o script para criar minhas tabelas:
CREATE TABLE clients (
client_i INT(11),
PRIMARY KEY (client_id)
);
CREATE TABLE projects (
project_id INT(11) UNSIGNED,
client_id INT(11) UNSIGNED,
PRIMARY KEY (project_id)
);
CREATE TABLE posts (
post_id INT(11) UNSIGNED,
project_id INT(11) UNSIGNED,
PRIMARY KEY (post_id)
);
No meu código PHP, ao excluir um cliente, desejo excluir todas as postagens de projetos:
DELETE
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;
A tabela mensagens não tem uma chave estrangeira client_id
, única project_id
. Quero excluir as postagens em projetos que passaram client_id
.
No momento, isso não está funcionando porque nenhuma postagem foi excluída.
DELETE posts FROM posts JOIN projects ...
, e não umIN (subquery)
padrão. (A resposta de Yehosef dá um exemplo do padrão preferido.)alias
o nome da tabela e usá-lo.Respostas:
Você só precisa especificar que deseja excluir as entradas da
posts
tabela:EDIT: Para mais informações, você pode ver esta resposta alternativa
fonte
DELETE d FROM posts AS d JOIN projects AS p ON ...
DELETE posts , projects FROM posts INNER JOIN projects ON projects.project_id = posts.project_id WHERE projects.client_id = :client_id
Como você seleciona várias tabelas, a tabela da qual excluir não é mais inequívoca. Você precisa selecionar :
Nesse caso,
table_name1
etable_name2
são a mesma tabela, então isso funcionará:Você pode até excluir das duas tabelas se desejar:
Observe que
order by
elimit
não funciona para exclusões de várias tabelas .Lembre-se também de que, se você declarar um alias para uma tabela, deverá usá-lo ao se referir à tabela:
Contribuições de Carpetsmoker e etc .
fonte
ON
capitalizado. Para desenvolvedores menos experientes, isso pode indicar que não há problema em ser confuso e inconsistente em termos de estilo.Ou a mesma coisa, com uma sintaxe ligeiramente diferente (mais amigável da IMO):
BTW, com o mysql usando junções é quase sempre muito mais rápido que as subconsultas ...
fonte
USING
: stackoverflow.com/questions/11366006/mysql-on-vs-usingVocê também pode usar o ALIAS assim funciona, apenas usei no meu banco de dados! É necessário excluir a tabela!
fonte
Estou mais acostumado com a solução de subconsulta para isso, mas ainda não tentei no MySQL:
fonte
MySQL DELETE registra com JOIN
Você geralmente usa INNER JOIN na instrução SELECT para selecionar registros de uma tabela que possui registros correspondentes em outras tabelas. Também podemos usar a cláusula INNER JOIN com a instrução DELETE para excluir registros de uma tabela e também os registros correspondentes em outras tabelas, por exemplo, para excluir registros das tabelas T1 e T2 que atendem a uma condição específica, use a seguinte instrução:
Observe que você coloca os nomes das tabelas T1 e T2 entre DELETE e FROM. Se você omitir a tabela T1, a instrução DELETE excluirá apenas os registros da tabela T2 e, se você omitir a tabela T2, somente os registros da tabela T1 serão excluídos.
A condição de junção T1.key = T2.key especifica os registros correspondentes na tabela T2 que precisam ser excluídos.
A condição na cláusula WHERE especifica quais registros no T1 e T2 que precisam ser excluídos.
fonte
Exclusão de tabela única:
Para excluir entradas da
posts
tabela:Para excluir entradas da
projects
tabela:Para excluir entradas da
clients
tabela:Excluir várias tabelas:
Para excluir entradas de várias tabelas dos resultados associados, é necessário especificar os nomes das tabelas depois
DELETE
como lista separada por vírgula:Suponha que você queira excluir entradas de todas as três tabelas (
posts
,projects
,clients
) para um determinado cliente:fonte
Tente como abaixo:
fonte
Outro método de exclusão usando uma sub-seleção que é melhor do que usar
IN
seriaWHERE
EXISTS
Uma razão para usar isso em vez da junção é que a
DELETE
withJOIN
proíbe o uso deLIMIT
. Se você deseja excluir os blocos para não produzir bloqueios de tabela completos, adicioneLIMIT
esteDELETE WHERE EXISTS
método.fonte
posts
EXISTS () é o mesmo deposts
onde as linhas são excluídas. (IMHO de qualquer maneira)DELETE p FROM posts p WHERE EXISTS ( SELECT 1 FROM projects WHERE projects.client_id = p.client_id);
DELETE registros de uma tabela:
EXCLUIR REGISTROS DE ambas as tabelas:
fonte
Se a junção não funcionar, você pode tentar esta solução. É para excluir registros órfãos de t1 quando não estiver usando chaves estrangeiras + condição específica. Ou seja, ele exclui registros da tabela1, que possuem o campo "código" vazio e que não possuem registros na tabela2, correspondendo pelo campo "nome".
fonte
Tente isso,
fonte
- Observe que você não pode usar um alias sobre a tabela em que precisa excluir
fonte