# Foreignkey -> Zusammengesetzt



## Generic1 (7. Mai 2010)

Hallo,

ich versuche mittlerweile schon ein paar Stunden, einen n:m Verbindung mittels mysql zusammenzubringen:

Das Problem ist PRIMARY KEY(fk_part, fk_event) -> wenn fk_part vor fk_event steht dann lässt sich die TEvent- Tabelle nicht erstellen und wenn ich die fk_part und fk_event umdrehe dann lässt sich TParticipant nicht erstellen.

Der Fehler den ich bekomme ist
Error code 1005, SQL state HY000: Can't create table 'EventTimingDB.TEvent' (errno: 150)

Weiß da jemand eine Lösung?
Besten Dank!!
lg


```
CREATE TABLE TEvent_TParticipant(fk_event INT NOT NULL,
                                 fk_part INT NOT NULL,
                                 PRIMARY KEY(fk_part, fk_event)
                                ) ENGINE = INNODB;

CREATE TABLE TParticipant(pk_part INT NOT NULL AUTO_INCREMENT,
                          PRIMARY KEY(pk_part),
                          FOREIGN KEY(pk_part) REFERENCES TEvent_TParticipant(fk_part)
                          ) ENGINE = INNODB;

CREATE TABLE TEvent(pk_event INT NOT NULL AUTO_INCREMENT,
                    PRIMARY KEY(pk_event),
                    FOREIGN KEY(pk_event) REFERENCES TEvent_TParticipant(fk_event)
                    ) ENGINE = INNODB;
```


----------



## SlaterB (7. Mai 2010)

wieso sollten die Tabellen TParticipant und TEvent auf TEvent_TParticipant verweisen?
das macht keinen Sinn, dann könnte man ja erste Participanten erstellen, wenn bereits ein Verknüpfungseintrag vorliegt,
nein,  TParticipant und TEvent brauchen gar keine ForeignKeys, sind für sich gut,
die beiden Tabellen werden auch als erste erstellt,

dann kommt TEvent_TParticipant, zusammengesetzter Primary Key sollte gehen, genaue Syntax kenne ich aber nicht,
und einzeln kann man die beiden Spalten als Foreign Key auf die beiden anderen Tabellen deklarieren


----------



## Java.getSkill() (7. Mai 2010)

Immer einen künstlichen key benutzen, denn was ist wenn du z.b. einen Participant löscht und das ganze Ding kaskadiert, also überall den pk als fk in den anderen Tabellen löscht.

Dann fehlt dir die Historie in der TEvent_TParticipant. Du kannst ja ne Person löschen, dennoch möchtest du sehen, an welchen Events diese gelöschte Person vor 10 Jahren teilgenommen hat.

btw TEvent_TParticipant als Hilftabelle muss natürlich als letztes erstellt werden, da du ja von den 2 anderen Tabellen ihre PK in TEvent_TParticipant als FK benutzen möchtest.


----------



## Generic1 (7. Mai 2010)

Besten Dank, habs jetzt so realisiert:


```
CREATE TABLE TEvent(pk_event INT NOT NULL AUTO_INCREMENT,
                    eventname VARCHAR(80),
                    PRIMARY KEY(pk_event)
                    ) ENGINE = INNODB;

CREATE TABLE TParticipant(pk_part INT NOT NULL AUTO_INCREMENT,
                          firstname   VARCHAR(100) NOT NULL,
                          surname     VARCHAR(150) NOT NULL,
                          chipnumber  VARCHAR(8),
                          fk_club     INT,
                          fk_address  INT,
                          fk_born     INT,
                          fk_gender   INT,
                          UNIQUE (chipnumber),
                          PRIMARY KEY(pk_part)
                          ) ENGINE = INNODB;

CREATE TABLE TEvent_TParticipant(id_event INT NOT NULL,
                                 id_part INT NOT NULL,
                                 PRIMARY KEY(id_part, id_event),
                                 FOREIGN KEY(id_part)  REFERENCES TParticipant(pk_part),
                                 FOREIGN KEY(id_event) REFERENCES TEvent(pk_event)
                                ) ENGINE = INNODB;
```


----------

