1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

MySQL: Anzahl verlinkter Rows auf Foreign Key

Dieses Thema im Forum "Relationale Datenbanksysteme" wurde erstellt von Tommy57, 28. November 2017.

  1. Tommy57

    Tommy57 Erfahrenes Mitglied

    Hi,

    ich möchte gerne Zeilen aus einer Datenbank-Tabelle löschen, die in keiner Tabelle verwendet werden. Da ich die Tabelle für Zählungen verwende, ist dieser Vorgang leider wichtig.

    Gibt es eine Möglichkeit, ohne alle Tabellen einzeln aufzuzählen, herauszufinden, welche Spalten oder Zeilen auf jede ID der Tabelle zeigt und dann die Anzahl zu zählen?

    Gruß, Tommy
     
  2. Yaslaw

    Yaslaw n/a Moderator

    Ja. Es ist möglich.
    Wieviel Tabellen verweisen denn auf diese Tabelle?
    Und zeig mal ein bisschen Beispiel mit Feldnamen und so Dann können wir helfen ein SQL zusammenzusetzen.

    Ansonsten grundsätzlich
    Code (Text):
    1. select distinct
    2.     mt.id
    3. from
    4.     masterTable mt
    5.     left join slave1 s1 ob mt.id = s1.pid
    6.     left join slave2 s2 ob mt.id = s1.pid
    7.     left join slave3 s3 ob mt.id = s1.pid
    8. where
    9.     s1.id is null
    10.     and s2.id is null
    11.     and s3.id is null
     
    Tommy57 gefällt das.
  3. Tommy57

    Tommy57 Erfahrenes Mitglied

    Hi Yaslaw,

    danke für die schnelle Antwort. Meine Frage bezog sich eher darauf zu ermitteln, ob es quasi Elemente ohne eine einzige Verlinkung gibt. Im Prinzip liegen in der Datenbank Teams, die nur Sinn machen, wenn sie auch in anderen Tabellen verwendet werden. Ansonsten sind es im Prinzip Leichen und können gelöscht werden, da sie Zählungen beeinflussen.

    Über eine normale Abfrage hätte ich es auch gemacht, aber wollte vermeiden, alle Tabellen zu kontrollieren.
     
  4. Kalito

    Kalito Erfahrenes Mitglied

    Na da ist doch schon der Query von Yaslaw das richtige für dich. Du musst einfach prüfen ob Einträge aus der Master-Tabelle nicht in den anderen Tabellen vorkommt. Das erreichst du, wenn du einen Left JOin verwendest und auf das Ergebnis null prüfst.
     
  5. Tommy57

    Tommy57 Erfahrenes Mitglied

    Ja genau. Aber die Idee war eigentlich eben nicht alle Tabellen einzeln zu prüfen. Es sind glaub ich fast 100 Tabellen. Aber ich prüfe es so, wie Yaslaw gesagt hat. Das ist super so. Danke
     
  6. Yaslaw

    Yaslaw n/a Moderator

    Dann musst du einen Rutine Programmieren, dass alle deine Tabelle durchgeht, prüft ob das Feld team-id vorhanden ist. Mit allen Treffern ein grosses SQL zusammenstellen..

    Aber ehrlich, wenn du fast 100 Tabellen hast in der diese ID vorkommt, dann bezweifle ich, dass du eine saubere Datenstruktur hast. Ich vermute mal, du hast für jedes Jahr eine eigene Tabelle gemacht. Oder so ähnlich.
    Wenn ja, bau deine DB um.
     
  7. Tommy57

    Tommy57 Erfahrenes Mitglied

    Hi Yaslaw. Nee, so war das nicht gemeint. Die Datenbank hat vermutlich rund 100 Tabellen. Diese ID sollte nur in 4-5 Tabellen vorkommen, aber ich wollte nur auf Nummer sicher gehen, bevor ich die Zeilen lösche und sie werden doch noch in irgendeiner anderen Tabelle gelöscht. Dachte, wenn er im Stande ist, die anderen Zeilen zu löschen, kennt er vllt auch die Anzahl davon.
     
  8. Yaslaw

    Yaslaw n/a Moderator

    Dann kannst du auch keine INNER JOIN mit allen Tabellen machen. Das geht ja nur, wenn die Tabelle die ID besitzt.
    Am besten setzt du dich mal hin und malst ein Datenbankdiagram. Mit so vielen Tabellen kommt man da fast nicht drum herum wenn an den Überblick nicht verlieren will.
     
  9. Tommy57

    Tommy57 Erfahrenes Mitglied

    Du hast schon recht. Da es um Fussball geht und wir echt viele Daten haben über Stadien, Begegnungen, Platzierungen, Titel, Auszeichnungen, Karrieren, Videos, Zitate, Quiz-Fragen, TV-Programm und vieles mehr summiert sich das schon. Da müsste ich echt mal so ein Datenbankdiagramm erstellen. Gute Idee!

    Bei der Tabelle, um die es mir geht, handelt es sich um die Info, welches Team in welchem Jahr in welcher Liga gespielt hat. Wird diese ID nirgends nochmal verwendet, ist das ein Zeichen dafür, dass es ein sehr alter Matching Fehler ist, weil das Team zum Beispiel zwei Schreibweisen hat. Dadurch kommt es zum Beispiel vor, dass wir 18 Teams in der Tabelle (Fussball Tabelle, nicht Datenbank Tabelle) haben, aber 19 Teilnehmer registriert sind. Da ich prinzipiell foreign keys verwende, dachte ich, ich könnte die Anzahl der Zeilen zählen, die mit der ID verknüpft sind. Dürften aber wie gesagt nur 4-5 Tabellen sein. Ich kann das auch im Dump schnell per Textsuche herausfinden. Dachte nur, vllt gibt es eine elegantere Lösung.
     
  10. Yaslaw

    Yaslaw n/a Moderator

    Mit 4 bis 5 Tabellen ist der LEFT JOIN Ansatz der Richtige
     
    Tommy57 gefällt das.
  11. Tommy57

    Tommy57 Erfahrenes Mitglied

    Ja genau, das passt. Danke
     
Die Seite wird geladen...