# MySQL - Beziehungen bei Tabellen herstellen



## Horstl (12. Juni 2004)

heeey =)

Also ich hoffe, mein Betreff ist nicht allzu verwirrend/falsch, da mir leider der Name entfallen ist, wie  die besondere Art von Tabellen heißen.

Mein Ziel ist es, für mich persönlich eine kleine Film Verwaltung zu programmieren. PHP und MySql ist für mich nicht das Problem, nur mit der Datenmodelierung hab ich meine Probleme.

Auf dem Bild, das ich angehängt hab seht ihr meine "Tabellen" die ich geplant habe. Alle "eckigen Tabellen" (also Stars, Regisseur, Kategorie, usw.) hab ich schon erstellt. Aber ich hab keine Ahnung wie ich die "zwischen" (keine Ahnung wie die man das richtig nennt.) Tabellen bekomme (gemeint ist z.b. die spielt mit, leitet, ist ein, hat ein usw.)

Wie kann ich die erstellen? Sie sind ja nur Tabellen aus FK. 

Im Moment schau ich da noch nicht durch, und ich hoffe ihr könnt mir einen kleinen Hinweis geben, nach was ich meine Suche richten muss, oder wie ich das lösen kann.

lg und noch einen schönen Abend


----------



## Gorcky (13. Juni 2004)

Hallo  Horstl,

ist doch ganz einfach:
Jedes deiner Spalten in den Mehrfachverknüpfungstabellen (? - weiß jetzt auch nicht, wei die richtig heißen...)  ist für sich ein Fremdschlüssel.
Alle Fremdschlüssel zusammen bilden den Primärschlüssel. Damit ist auch gewährleistet, dass z.B. ein bestimmter Star nur einmal mit einem bestimmten Film verknüpft ist.
Demnach hast du das Modell schon richtig angefertigt.


----------



## Kingping (26. November 2004)

Ich hab auch schon in einem anderen thread gefragt : Wie lege ich diese fremdschlüssel an ?

(als beispiel in phpmyadmin)

gruss n thx


----------



## Gorcky (27. November 2004)

Du brauchst gar keine extra Spalten-Einstellungen für Fremdschlüssel anzulegen, da sie weder eindeutig, noch einzig (mehrere Spalten als jeweils getrennte Schlüssel möglich, sowie gleichzeitig Primärschlüssel, oder nicht)  sind/sein sollen.
Zu einem Fremdschlüssel wird eine Spalte also nur, indem du eine Andere Tabelle über diesen Schlüssel verknüpfst.


----------



## AlternativEgo (12. August 2009)

Hi

Ich muss zugeben, dass Ich das nicht ganz verstanden habe.
Ich habe ein ähnliches Problem.

Mich interessiert nur wie ich das mit der Syntax löse.

Bsp.

Ich habe 2 Tabellen mit den Primary Keys id1 für Tabelle1 und id2 für Tabelle2.
Nun möchte ich in Tabelle2 den PK aus Tabelle1 (id1) als Fremdschlüssel angeben. In MySql ist das mit ForeignKey bekanntlich nicht möglich.

id1 und id2 generieren sich bei mir über auto_increment quasi selbst. 

wenn id1 sich nun auch als Fremdschlüssel in Tabelle2 befindet, woher weiß MySQL also, dass id1 in Tabelle2 ein Fremdschlüssel ist? Ich habe es ihm ja nicht angegeben.

Mir würde einfach nur eine Beispiel Syntax helfen. Also wie der Code für dieses eig. leichte Problem aussieht.

Ich danke euch schonmal im Voraus

Greetz

AlterEgo


----------



## kuddeldaddeldu (12. August 2009)

Hi,

suchst Du Joins?

LG


----------



## AlternativEgo (12. August 2009)

Vielen Dank für die schnelle Antwort...

Soweit ich die Erklärung verstanden habe, brauche ich einen Equi. bzw. Natural Join..

Hab ich es richtig verstanden, dass MySQL den natural Join automatisch macht? 
Also, sobald 2 Spalten in verschiedenen Tabellen gleich heißen, wird automatisch ein Natural Join durchgeführt, richtig?

Oder muss ich das explizit angeben?

Greetz

AltereEgo


----------



## kuddeldaddeldu (13. August 2009)

Hi,



AlternativEgo hat gesagt.:


> Also, sobald 2 Spalten in verschiedenen Tabellen gleich heißen, wird automatisch ein Natural Join durchgeführt, richtig?
> 
> Oder muss ich das explizit angeben?



Das musst Du explizit angeben. Ein einfaches


```
SELECT * from tabelle1, tabelle2
```

liefert Dir alle erdenklichen Kombinationen der Datensätze aus beiden Tabellen.

Es muss also so aussehen:


```
select * from tabelle1 natural join tabelle2
```

Das funktioniert unter der Voraussetzung, dass es in Tabelle 2 einen Foreign Key mit dem Namen des Primary Key aus Tabelle 1 gibt. Das muss aber nicht so sein. Du kannst dem Foreign Key in Tabelle 2 auch einen anderen Namen geben (z.B. wenn der PK in Tabelle 1 "id" heißt und Du für Tabelle 2 auch "id" für den PK verwenden willst). 
Dann musst Du halt die Joinkriterien angeben:


```
select * from tabelle1
   inner join tabelle2
      on tabelle1.id = tabelle2.t1_id
```

LG


----------



## AlternativEgo (13. August 2009)

alles klar... vielen Dank...

eine letzte Frage hätte ich noch.

bsp. 
nehmen wir an wir ein Auto

tbl_marke
tbl_modell
tbl_fzg
tbl_aussattung

um die Datensätze zu füllen 

INSERT INTO tbl_marke VALUES(null, BMW');
INSERT INTO tbl_modell VALUES(null,'320i');
INSERT INTO tbl_ausstattung VALUES(null,430, 'Diesel', 'EPS', 6 , '4x4','klima', 'blau');
INSERT INTO tbl_fzg VALUES(null,1,1,1); 


in tbl_fzg sollen marke und modell mit Hilfe der ID's zusammengeführt werden und es wird eine neue ID in tbl_fzg über auto_increment angelegt.

Damit ist quasi das Fahrzeug identifiziert und es muss nur noch die Ausstattung angegeben werden.
also würden in tbl_fzg marke.maid, modell.moid und ausstattung.aid  stehen. Damit hätte ich quasi alles.

ich lege also einen Datensatz marke an mit bmw, modell mit 320i und die ausstattung.
in tbl_fzg soll nun das das Fahrzeug mit den zugehörigen id's der Tabellen stehen.
Ich muss dazu sagen, dass meine DB keine Suchfunktion haben soll. Die Sachen sollen einfach nur auf einer Seite angezeigt werden.

Kann der JOIN in der INSERT Anweisung verwendet werden? Wenn nicht, wie kann ich das sonst lösen? 

Sorry, wenn ich damit nerve, aber Ich habe mit MySQL ewig nicht mehr gearbeitet und ich bin für jede Hilfe sehr dankbar


Greetz 

AlterEgo
Meine Frage ist jetzt, ob man den Join auch in der INSERT INTO Anweisung anwenden kann?
Wie bekomme ich bei der Datensatzeingabe alle keys in tbl_fzg


----------



## kuddeldaddeldu (13. August 2009)

Hi,



AlternativEgo hat gesagt.:


> Kann der JOIN in der INSERT Anweisung verwendet werden? Wenn nicht, wie kann ich das sonst lösen?



nein, siehe INSERT-Syntax. Du könntest z.B. in Deiner Anwendung die neuen IDs mit LAST_INSERT_ID() zwischenspeichern oder Du schaust mal bei der INSERT...SELECT Syntax in die User Comments. Suche nach "4 2004 6:55am" und schau Dir an, wie der das gelöst hat.

LG


----------



## AlternativEgo (13. August 2009)

Hi

Vielen Dank... 
Ich habe das mit INSERT...SELECT gelöst... t super...

Danke nochmal

Greetz

AlternativEgo


----------

