MySQL Tabellen verknüpfen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL Tabellen verknüpfen

    Hallo,

    ich habe ein Problem und bin über jede Hilfe dankbar

    Ich möchte drei Tabellen mit einander verknüpfen - so wie ich das verstanden habe, brauch ich also eine vierte Tabelle wo die Primärschlüssel aus den anderen Tabellen Fremdschlüssel sind. Dann hab ich gelesen das so etwas nur bei InnoDB möglich ist und ich bei MyISAM die Verknüpfung im Skript über JOIN Abfragen erstellen muss. Leider seh ich immer nur Beispiele wo INNER JOINs etc, in SELECT Abfragen sind. Aber wie ist die INSERT und UPDATE Abfrage ? Oder brauch ich dazu wieder keine JOINs, aber dann würde ich sich auch Tabelle "service" nicht füllen.


    Ich habe mal meine Struktur angehanden.

    Freue mich über jeden hilfreichen Beitrag


    Gruß Rico
    Angehängte Dateien

  • #2
    Informiere dich über Fremdschlüssel. Mit solchen verknüpfst du deine Tabellen miteinander. Das Einfügen/Ändern von Datensätzen funktioniert dann weiter wie gewohnt, du musst nur die Fremdschlüsselverweise einhalten. D.h. du kannst nur Werte in eine Spalte mit Fremdschlüssel schreiben, die auch in der referenzierten Spalte vorhanden sind.

    Kommentar


    • #3
      Hallo,

      natürlich habe ich schon über Fremdschlüssel erkundigt.
      Was mir dabei aber nicht klar wurde funktioniert es auch bei MyISAM und wenn nicht und ich InnoDB verwende - brauch ich dann keine JOIN Abfragen mehr ?

      Kommentar


      • #4
        Fremdschlüssel werden von der MyISAM-Engine nicht unterstützt. Was meinst du mit dem Join? Die Select-Abfragen bleiben natürlich die gleichen. Nur beim Ändern von Datensätzen ist ein wenig Magie (automatisches Ändern abhängiger Datensätze) hinzugekommen und du musst darauf achten, den Fremdschlüssel-Constraint nicht zu verletzen.
        Falls das deine Frage nicht beantwortet, werde etwas präziser

        Kommentar


        • #5
          Das würde heißen benutze ich MyISAM muss ich bei der Abfrage mit reinschreiben was beim UPDATE oder DELETE passiert und bei InnoDB kann ich die Beziehungen schon festlegen ?

          Ich habe beide Varianten eigentlich schon ausprobiert. Nur krieg ich nie Daten eingefügt. Füllt sie die Tabelle mit den Fremdschlüsseln von selbst ? Zumindest bei InnoDB ?


          Ich weiß echt nicht wie ich anfangen sollte.

          Kommentar


          • #6
            MyISAM unterstützt keine Fremdschlüssel, d.h. es werden keine Datensätze automatisch mit den referenzierten Datensätzen abgeräumt oder geändert. Hier muss die Anwendung für die Datenintegrität sorgen, also bei einem Update müssen auch alle Referenzen aktualisiert bzw. bei einem Delete mit abgeräumt werden. Das macht der Fremdschlüssel sonst für dich.

            Ich mach mal nen ganz einfaches Beispiel:
            Code:
            create table configs (
            	name varchar(512) not null,
            	value varchar(512) not null,
            	primary key( name )
            ) engine=innodb;
            
            create table foo (
            	id integer unsigned not null auto_increment,
            	config_name varchar(512) not null,
            	data text not null,
            	primary key( id ),
            	foreign key( config_name )
            		references configs( name )
            		on update cascade
            		on delete cascade
            ) engine=innodb;
            Tabelle mit Daten füllen:
            Code:
            insert into configs values('is_blue', '1'), ('is_red', '1');
            Der folgende Datensatz enthält eine Referenz auf die is_blue-Konfiguration:
            Code:
            insert into foo(config_name, data) values('is_blue', 'foobar');
            Dieser Einfügevorgang geht schief, da kein Wert mit Namen is_black nicht vorhanden ist.
            Code:
            insert into foo(config_name, data) values('is_black', 'bla');
            Fehler:
            Code:
            #1452 - Cannot add or update a child row: a foreign key constraint fails (`test/foo`,
            CONSTRAINT `foo_ibfk_1` FOREIGN KEY (`config_name`) REFERENCES `configs` (`name`) ON DELETE CASCADE ON UPDATE CASCADE)
            Das Löschen ist analog. Wenn du einen Datensatz aus der configs-Tabelle löschst, werden alle Referenzen in der foo-Tabelle automatisch mit abgeräumt (ON DELETE CASCADE).

            Kommentar


            • #7
              Woooow

              Super, danke!

              Das Prinzip habe ich denke ich verstanden.
              InnoDB, vorher Beziehungen festlegen, was beim UPDATE oder DELETE passiert.
              INSERT für jede Tabelle einzeln und SELECT, da könnte ich dann ja auch jede Tabelle einzeln Abfragen ?

              Kommentar


              • #8
                SELECT, da könnte ich dann ja auch jede Tabelle einzeln Abfragen ?
                Das könntest du tun, wenn du willst. Bei den Abfragen bleibt alles das gleiche.

                Kommentar


                • #9
                  Hm,

                  bleibt mir nur noch eine Frage offen:

                  Als Beispiel

                  Tabelle_kunden

                  ID | VORNAMENAME | NACHNAME
                  1 | Max | Mustermann
                  2 | Maxi | Mustermann

                  Tabelle_Subdomain

                  ID | WUNSCHDOMAIN | AKTIVEDOAMIN
                  1 | test1domain | keine
                  2 | test2domain | keine
                  3 | test3domain | keine

                  Tabelle_Einstellungen

                  ID | EINSTELLUNG1| EINSTELLUNG2
                  1 | TRUE | TRUE
                  2 | FALSE | TRUE
                  3 | FALSE | TRUE

                  Tabelle_Aufträge

                  ID | kundenID| subdomainID | einstellungenID
                  1 | 1 | 1 |1
                  2 | 2 | 2 |2
                  3 | 1 | 3 |3


                  So sollte es am Ende aussehen. Beziehungen hab ich halt in der Tabelle Aufträge.
                  kundenID => Tabelle_Kunden FELD:ID
                  subdomainID=> Tabelle_Subdomain FELD:ID
                  einstellungenID => Tabelle_Einstellungen FELD:ID

                  Das kann nicht richtig sein oder ?
                  Zuletzt geändert von RicoD; 06.05.2009, 15:47.

                  Kommentar


                  • #10
                    Ob das jetzt korrekt normalisiert ist, sei mal dahingestellt. Aber es ist durchaus möglich, von einer Tabelle auf 3 weitere zu verweisen. Warum auch nicht?
                    Zu deiner Anwendung kann ich nicht viel sagen, dazu weiß ich zu wenig von dieser. Aber sieht schon ok aus. Was auch immer WUNSCHDOMAIN und AKTIVEDOAMIN sind.

                    Kommentar


                    • #11
                      Zu meiner Anwendung:

                      Soll eine einfache Subdomainverwaltung werden:

                      Jeder Kunde hat eine loginID die am LDAP hängt,
                      Kunden meldet sich an, sieht ein Formular, sag eine Wunsch-Subdomain und ein Pfad wohin das ganze weisen soll.

                      Jeder Kunde darf mehr als einen Subdomain haben.

                      Im internen Bereich soll halt geguckt werden ob die wunsch_domain erlaubt ist und wenn ja wird sie in aktiv_domain eingetragen.

                      Es geht einfach nur um die Datenbankstruktur.
                      Bis jetzt habe ich alles in einer Tabelle. Erstens ist da nichts normalisiert - und ein Kunde kann auch nur eine Subdomain haben, da LoginID Primärkey ist.

                      Kommentar


                      • #12
                        du "verknüpfst" hier über die WHERE klausel

                        [...]
                        WHERE kunde_tbl.kunden_id = domain_tbl.kunden_id
                        Gruß
                        Uzu

                        private Homepage

                        Kommentar

                        Lädt...
                        X