SQL Befehl zum Vergleichen

Jacky007

Lieutenant
Registriert
Okt. 2006
Beiträge
658
Hi,

vllt. kann mir jemand helfen. Kenne mich leider nicht so gut aus.
Und zwar habe ich in einer Maria DB zwei Tabellen "CatFiles" und "Files"

In "CatFiles" sind verschiedene Spalten - wichtig ist die Spalte "files_id" - das sind die IDs von den Files in der Tabelle "Files". In der Tabelle "Files" sind einfach File_infos drin. Wenn nun irgendwelche Files gelöscht werden, werden diese in der Tabelle "Files" gelöscht, jedoch bleibt die Verknüpft in "CatFiles" drin.

Daher möchte ich mit einem SQL-Befehl abfragen, welche Files nicht mehr vorhanden sind bzw. unnötige Einträge in der Tabelle "CatFiles" aufspüren und evtl. löschen. Also in der Tabelle "CatFiles" Spalte "files_id" den Wert der "files_id" (z.B. 3453) mit der Spalte ID in der Tabelle "Files" abgleichen, und nur die anzeigen, die eben nicht mehr vorhanden sind.

Hoffe man konnte mich etwas verstehen und danke im Voraus!

LG
Jacky
 
Zuerst löschen, dann nen foreign key mit on Update cascade oder sowas setzen.

Zum finden:
SQL:
select c.files_id from catfiles c
Left join files f on c.files_id = f.id
where f.Id is null

Das benötigte Modell ist ein Antijoin, mengenmäßig Catfiles \ Files.
 
Jacky007 schrieb:
Wenn nun irgendwelche Files gelöscht werden, werden diese in der Tabelle "Files" gelöscht, jedoch bleibt die Verknüpft in "CatFiles" drin.
sowas macht man aber auch nicht manuell dann, dafuer gibt es sowas wie DELETE CASCADE auf dem Fremdschluessel. Erweitere mal deine DB dahingehend.
 
  • Gefällt mir
Reaktionen: Jacky007
Versuch es mal mit:

select * from CatFiles where files_id not in (select files_id from Files);

Daraus kannst Du dann ein Delete-Statement machen:

delete from CatFiles where files_id not in (select files_id from Files);
 
  • Gefällt mir
Reaktionen: Jacky007
HalisCB schrieb:
Versuch es mal mit:

select * from CatFiles where files_id not in (select files_id from Files);

Daraus kannst Du dann ein Delete-Statement machen:

delete from CatFiles where files_id not in (select files_id from Files);
danke genau das habe ich gesucht.
 
Zurück
Oben