Próbuję usunąć osierocone wpisy w tabeli mysql.
Mam 2 takie tabele:
Tabela files
:
| id | ....
------------
| 1 | ....
| 2 | ....
| 7 | ....
| 9 | ....
stół blob
:
| fileid | ....
------------
| 1 | ....
| 2 | ....
| 3 | ....
| 4 | ....
| 4 | ....
| 4 | ....
| 9 | ....
Do łączenia tabel można użyć kolumn fileid
i id
.
Chcę usunąć wszystkie wiersze w tabeli, blob
których fileid
nie można znaleźć w tabeli files.id
.
Korzystając z powyższego przykładu, można usunąć wiersze: 3 i 4 (y) w blob
tabeli.
null
s.Odpowiedzi:
Używanie LEFT JOIN / IS NULL:
Korzystanie NIE ISTNIEJE:
Korzystanie NOT IN:
Ostrzeżenie
O ile to możliwe, wykonaj DELETE w ramach transakcji (zakładając, że jest obsługiwana - IE: nie w MyISAM), aby móc użyć wycofywania zmian w celu cofnięcia zmian w przypadku problemów.
źródło
fileid
jest bez pustych . Ponadto trzecie rozwiązanie (NOT IN
) wymaga tylko tego, abyf.id
nie dopuszczać wartości null. Przypuszczalnie jest to klucz podstawowy, więc tak by było.źródło
NOT IN (NULL)
zwraca pusty zestaw wyników, więc należy wykluczyć wartości NULL. Aleid
kolumna prawdopodobnie i tak nie będzie miała wartości null, stąd „raczej nie będzie potrzebna”not in(null)
jest całkiem logiczne, dlaczego nie działa? Jaki jest tego powód?unknown
i coś jest albofalse
albounknown
i nigdy nie można oceniać natrue
źródło
files.id
iblob.fileid
. Zgaduję, że twoje zapytanie spowoduje błąd.źródło
NOT EXISTS
został opublikowany już 9 lat temu. 4. Nie promowałeś najlepszej praktyki polegającej na konsekwentnym używaniu wielkich liter w słowach kluczowych MySQL. Innymi słowy, nie ma tu nic wartego zachowania - dlatego też głosowałem za usunięciem tego posta.