Fremdschlüssel

Tauchen Fremdschlüssel nur im Zusammenhang mit Constraint auf?
Wenn nicht wo denn sonst…??

Hi haruna,

ich würde sagen das ein Fremdschlüssel eine mögliche Art eines Constraints ist, so wie ein Primärschlüssel, Unique, Not Null usw., deshalb würde ich sagen das sich die Frage erübrigt. Vielleicht sehe ich das ja auch falsch,

Gruß Chris

Moin, haruna,

Tauchen Fremdschlüssel nur im Zusammenhang mit Constraint auf?

ein Fremdschlüssel ohne Constraint ist kein Fremdschlüssel, sondern ein stinknormales Attribut.

Fremdschlüssel ist doch die Zusicherung, dass der Wert des Feldes in einer zweiten Tabelle der Datenbank vorhanden ist.

Wenn nicht wo denn sonst…??

Wo hättest Du’s denn gerne?

Gruß Ralf

Berichtigung
Moin,

Fremdschlüssel ist doch die Zusicherung, dass der Wert des Feldes in einer zweiten Tabelle der Datenbank als Schlüssel vorhanden ist.

Gruß Ralf

also bringt mir ein fremdschlüssel ohne constraint gar nichts??
also wenn ich irgendwie schreibe
create table (tablename) (a char(20),b char(30),foreign key(a) references (primary key einer anderen tabelle) delete on cascade…

…als ich das ausprobiert hab, hat mir das irgendwie nichts gebracht…
es wurde nichts on cascade gelöscht…
dafür bräuchte ich also constraints??

Moin, haruna,

on delete legt fest, was mit dem Child passieren soll, wenn das Parent gelöscht wird.

Gruß Ralf

Hi,

Ein ForeignKey IST ein Constraint.
Zu deinem Problem mit dem Löschen : War der Constraint aktiv zu diesem Zeitpunkt ? Kannst du mal das komplette Beispiel posten ?

Gruss

Oke mittlerweile versteh ich ein wenig mehr… aber so ganz klar ist mir das nicht…
Also diese Datentabelle gehen über Fußballspiele.

Tabelle heißt „Spiele“
Primärschlüssel ist Datum und Heim

±----------±---------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±----------±---------±-----±----±--------±------+
| Datum | char(20) | NO | PRI | | |
| Heim | char(20) | NO | PRI | | |
| Gast | char(20) | YES | | NULL | |
| Anpfiff | char(20) | YES | | NULL | |
| Stadion | char(20) | YES | | NULL | |
| Zuschauer | char(20) | YES | | NULL | |
| LPM | char(20) | YES | | NULL | |
| Saison | char(20) | YES | | NULL | |
±----------±---------±-----±----±--------±------+

zweite Tabelle ist „Tore“

±--------±---------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±--------±---------±-----±----±--------±------+
| tDatum | char(20) | YES | MUL | NULL | |
| tHeim | char(20) | YES | | NULL | |
| tStand | char(20) | YES | | NULL | |
| tMin | char(20) | YES | | NULL | |
| tTortyp | char(20) | YES | | NULL | |
±--------±---------±-----±----±--------±------+

der create Befehl sah folgendermaßen aus:
create table Tore(tDatum char(20),tHeim char(20),tStand char(20),tMin char(20), tTortyp char(20),constraint foreign key(tDatum,tHeim)references Spiele(Datum,Heim) on delete cascade on update restrict)engine=INNODB;

also ich habe zwei Spalten als foreign key verwendet… genau die die auch bei „Spiele“ als Primärschlüssel sind… nun bin ich aber leicht verwirrt und wunder mich:
Muss der Fremdschlüssel so wie der Primärschlüssel sein?
Kann ich auch nur eine Spalte als Fremdschlüssel benutzen und habe das gleiche Ergebnis?
Kann ich auch irgendeine Spalte (zB tMin) als Fremdschlüssel anlegen und hab das gleiche Ergebnis?

Wenn mir das jemand noch sagen kann… hab ich Fremdschlüssel bestimmt verstanden =D.
Danke für eure Hilfe!

Moin, haruna,

sowas schreibt sich kürzer:

**Spiele** (<u>Datum, Heim</u>, Gast, ...)

**Tore** (<u>tDatum, tHeim</u>, tStand, ...)

Beziehung:

 Spiele Tore

Damit hast Du eine 1:1-Beziehung zwischen Spiele und Tore. Die Klausel delete on cascade besagt, dass beim Löschen eines Satzes aus Spiele auch der entsprechende Satz aus Tore gelöscht wird.

Wenn das in Deinem Sinne ist, sind wir jetzt fertig :smile:

Muss der Fremdschlüssel so wie der Primärschlüssel sein?

Nein, Du kannst Dich auch auf Teile des Schlüssels beziehen, das Gebilde dann noch Beziehung zu nenne, wäre allerdings sehr gewagt.

Kann ich auch nur eine Spalte als Fremdschlüssel benutzen

Soweit ich weiß, erlauben das alle DBMS.

und habe das gleiche Ergebnis?

Hinsichtlich des delete on cascade durchaus.

Kann ich auch irgendeine Spalte (zB tMin) als Fremdschlüssel
anlegen

Ich kenne nicht alle DBMS, meine aber, dass die Quelle eines FS immer ein Schlüssel sein muss. Außer in Access, da kann man sich wohl auf Felder außerhalb des Schlüssels beziehen, ich habe aber keinen Schimmer, wozu das gut sein soll.

Gruß Ralf