Estou tentando excluir entradas órfãs em uma tabela mysql.
Eu tenho 2 tabelas como esta:
Quadro files
:
| id | ....
------------
| 1 | ....
| 2 | ....
| 7 | ....
| 9 | ....
tabela blob
:
| fileid | ....
------------
| 1 | ....
| 2 | ....
| 3 | ....
| 4 | ....
| 4 | ....
| 4 | ....
| 9 | ....
As colunas fileid
e id
podem ser usadas para unir as tabelas.
Quero excluir todas as linhas da tabela blob
onde fileid
não podem ser encontradas na tabela files.id
.
Então, usando o exemplo acima, isso excluiria as linhas: 3 e 4 (s) na blob
tabela.
null
s.Respostas:
Usando LEFT JOIN / IS NULL:
Usando NOT EXISTS:
Usando NOT IN:
Aviso
Sempre que possível, execute DELETEs em uma transação (assumindo suporte - IE: não no MyISAM), para que você possa usar a reversão para reverter alterações em caso de problemas.
fonte
fileid
é não-nulo . Além disso, a terceira solução (NOT IN
) exige apenas quef.id
não seja nulo. Presumivelmente, essa é uma chave primária, assim seria.fonte
NOT IN (NULL)
retorna um conjunto de resultados vazio, portanto é necessário excluir NULLs. Mas umaid
coluna provavelmente não será anulável qualquer maneira, portanto, "improvável de ser necessário"not in(null)
é bastante lógico, por que não funciona? Qual é a lógica por trás disso?unknown
e qualquer coisa ou éfalse
ouunknown
e nunca pode avaliar atrue
fonte
files.id
eblob.fileid
. Suponho que sua consulta resultará em um erro.fonte
NOT EXISTS
já foi publicado há 9 anos. 4. Você não promoveu a melhor prática de usar sempre letras maiúsculas para palavras-chave do MySQL. Em outras palavras, não há nada aqui que valha a pena manter - por isso também votei em excluir esta postagem.