Ich versuche, verwaiste Einträge in einer MySQL-Tabelle zu löschen.
Ich habe 2 Tabellen wie diese:
Tabelle files
:
| id | ....
------------
| 1 | ....
| 2 | ....
| 7 | ....
| 9 | ....
Tabelle blob
:
| fileid | ....
------------
| 1 | ....
| 2 | ....
| 3 | ....
| 4 | ....
| 4 | ....
| 4 | ....
| 9 | ....
Die Spalten fileid
und id
können verwendet werden, um die Tabellen miteinander zu verbinden.
Ich möchte alle Zeilen in der Tabelle löschen , blob
wo fileid
nicht in der Tabelle zu finden files.id
.
Verwenden Sie also das obige Beispiel, um die Zeilen zu löschen: 3 & 4 (s) in der blob
Tabelle.
null
s verwenden.Antworten:
Verwenden von LEFT JOIN / IS NULL:
Verwenden von NOT EXISTS:
Verwenden von NOT IN:
Warnung
Führen Sie nach Möglichkeit DELETEs innerhalb einer Transaktion aus (vorausgesetzt, unterstützt - IE: Nicht unter MyISAM), damit Sie bei Problemen mithilfe des Rollbacks Änderungen rückgängig machen können.
quelle
fileid
ist nicht nullable . Auch die dritte Lösung (NOT IN
) erfordert nur, dassf.id
nicht nullbar. Vermutlich ist das ein Primärschlüssel, also wäre es.quelle
NOT IN (NULL)
eine leere Ergebnismenge zurück, sodass NULL-Werte ausgeschlossen werden müssen. Aber eineid
Spalte wird wahrscheinlich sowieso nicht nullbar sein, daher "wahrscheinlich nicht benötigt"not in(null)
ist ziemlich logisch, warum funktioniert es nicht? Was ist der Grund dafür?unknown
und irgendetwas ist entwederfalse
oderunknown
und kann nie bewertentrue
quelle
files.id
undblob.fileid
. Ich vermute, Ihre Anfrage wird zu einem Fehler führen.quelle
NOT EXISTS
wurde bereits vor 9 Jahren veröffentlicht. 4. Sie haben nicht für die bewährte Methode geworben, All-Caps für MySQL-Schlüsselwörter konsequent zu verwenden. Mit anderen Worten, hier gibt es nichts, was es wert wäre, behalten zu werden - deshalb habe ich auch dafür gestimmt, diesen Beitrag zu löschen.