2013-07-03 11 views
10

Ich versuche eine Viele-zu-Viele-Beziehung in meiner MySQL-Datenbank zu erstellen. Ich habe drei Tabellen: Films, Genres und Films_Genres. Ich verwende den folgenden Code, um sie einzurichten:MySQL-Viele-zu-Viele-Beziehung mit FOREIGN KEYS

CREATE TABLE Films 
( 
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    Title VARCHAR(255) 
), 

CREATE TABLE Genres 
( 
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    Name VARCHAR(255) 
), 

CREATE TABLE Films_Genres 
(
    film_id INT NOT NULL, 
    genre_id INT NOT NULL, 
    PRIMARY KEY (film_id, genre_id), 
    FOREIGN KEY (film_id) REFERENCES Films(id) ON UPDATE CASCADE, 
    FOREIGN KEY (genre_id) REFERENCES Genres(id) ON UPDATE CASCADE 
) 

Allerdings, wenn ich versuche, einige Werte in die Tabellen einfügen mit:

INSERT INTO Films (Title) VALUES ('$title') 
INSERT INTO Genres (Name) VALUES ('$genre') 

ich den neuen Film in Films Tabelle sehen kann und die neues Genre in Genres Tabelle, aber die Films_Genres Tabelle wird nicht aktualisiert - es gibt keine neuen Zeilen (ich überprüfe über phpMyAdmin).

Was mache ich falsch?

+0

Fügen Sie den PHP-Code ein, oder wir können nicht helfen. Haben Sie verifiziert, dass '$ title' und' $ genre' existieren? Etc. –

+0

Ich kann die Ergebnisse von Filmen und Genres zeigen - sie arbeiten. Das einzige Problem ist, dass die Films_Genres-Tabelle keine Zeilen addiert. PHP scheint in Ordnung zu sein. Ich benutze mysqli_query ($ con, $ sql), um den SQL-Code auszuführen. Ist die SQL korrekt? – Sharkz

+0

Also ich nehme an, die Verbindung in 'Films_Genres' fehlt ist deine Frage in Sorge. Wenn dies der Fall ist, müssen Sie diese beiden Datensätze selbst beziehen. –

Antwort

15

Sie werden nichts in Films_Genres Tabelle sehen, bis Sie explizit etwas darin einfügen. Die referenzielle Integrität durch PK und FK ist nicht dafür gedacht, Ihre Tabellen für Sie zu füllen.

Ihr MySql-Code für einen neuen Rekord in Films_Genres Einfügen, wenn es einen neuen Film ist, der zu einem neuen Genre entspricht, wie

INSERT INTO Films (Title) VALUES ('Title1'); 
SET @film_id = LAST_INSERT_ID(); 

INSERT INTO Genres (Name) VALUES ('Genre1'); 
SET @genre_id = LAST_INSERT_ID(); 

INSERT INTO Films_Genres (film_id, genre_id) VALUES(@film_id, @genre_id); 

auf PHP Seite aussehen könnte eine neu zugewiesene ID für einen autoinkrementierten zu bekommen Feldbenutzung $mysqli->insert_id.

Nun, wenn Sie einen neuen Film erstellen möchten, und es mehrere Genres zuordnen auf einmal Sie

INSERT INTO Films (Title) VALUES ('Title2'); 
SET @film_id = LAST_INSERT_ID(); 
-- if you get ids of genre from your UI just use them 
INSERT INTO Films_Genres (film_id, genre_id) 
SELECT @film_id, id 
    FROM Genres 
WHERE id IN (2, 3, 4); 

INSERT INTO Films (Title) VALUES ('Title3'); 
SET @film_id = LAST_INSERT_ID(); 
-- if you names of genres you can use them too 
INSERT INTO Films_Genres (film_id, genre_id) 
SELECT @film_id, id 
    FROM Genres 
WHERE Name IN ('Genre2', 'Genre4'); 

tun können, hier ist SQLFiddle Demo

+0

Wow! Ich hätte nicht besseres erwarten können! Danke vielmals! Ich liebe stackoverflow: D – Sharkz

+0

@Sharkz Gern geschehen :) Siehe aktualisierte Antwort für zusätzliche Informationen. – peterm

0

Grundsätzlich sollten Sie eine Zeile einfügen in die Link-Tabelle, um einen Film und ein Genre, das Sie gerade eingefügt haben, zu "link". Msql-Engine macht das nicht automatisch für Sie (es weiß einfach nicht, dass diese 2 Datensätze irgendwie verwandt sein sollten) - das ist zu auf der Applikationsseite oder manuell

01 erfolgen
0

Sie müssen die Viele-zu-Viele-Tabelle selbst ausfüllen, so funktioniert mysql, hier wird leider keine automatische Vermutungsarbeit durchgeführt.