Estoy tratando de eliminar entradas huérfanas en una tabla mysql.
Tengo 2 tablas como esta:
Tabla files
:
| id | ....
------------
| 1 | ....
| 2 | ....
| 7 | ....
| 9 | ....
tabla blob
:
| fileid | ....
------------
| 1 | ....
| 2 | ....
| 3 | ....
| 4 | ....
| 4 | ....
| 4 | ....
| 9 | ....
Las columnas fileid
y id
se pueden usar para unir las tablas.
Quiero eliminar todas las filas en la tabla blob
donde fileid
no se pueden encontrar en la tabla files.id
.
Entonces, usando el ejemplo anterior que eliminaría filas: 3 y 4 (s) en la blob
tabla.
null
s.Respuestas:
Usando IZQUIERDA UNIR / ES NULO:
Usar NO EXISTE:
Usando NOT IN:
Advertencia
Siempre que sea posible, realice DELETEs dentro de una transacción (suponiendo que sea compatible - IE: no en MyISAM) para que pueda usar la reversión para revertir los cambios en caso de problemas.
fuente
fileid
es no anulable . Además, la tercera solución (NOT IN
) solo requiere quef.id
no sea anulable. Presumiblemente, esa es una clave principal, por lo que sería.fuente
NOT IN (NULL)
devuelve un conjunto de resultados vacío, por lo que los NULL deben excluirse. Pero unaid
columna probablemente no será anulable de todos modos, por lo tanto, "es poco probable que sea necesaria"not in(null)
es bastante lógico, ¿por qué no funciona? ¿Cuál es la razón detrás de eso?unknown
y cualquier cosa esfalse
ounknown
nunca puede evaluarsetrue
fuente
files.id
yblob.fileid
. Supongo que su consulta dará como resultado un error.fuente
NOT EXISTS
ya fue publicado hace 9 años. 4. No ha promovido la mejor práctica de usar consistentemente mayúsculas para palabras clave MySQL. En otras palabras, no hay nada aquí que valga la pena mantener, es por eso que también he votado para eliminar esta publicación.