MySQL relazione molti-a-molti con KEYS ESTERI

Sto cercando di creare una relazione molti-a-molti nel mio database MySQL. Ho tre tavoli: Films , Films_Genres e Films_Genres . Sto usando il seguente codice per configurarli:

 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 ) 

Tuttavia, quando provo a inserire alcuni valori nelle tabelle con:

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

Riesco a vedere la nuova tabella Film in Films e la nuova tabella Genre in Films_Genres ma la tabella Films_Genres non si aggiorna, non ci sono nuove righe (sto controllando tramite phpMyAdmin).

Che cosa sto facendo di sbagliato?

Non vedrai nulla nella tabella Films_Genres finché non inserirai esplicitamente qualcosa in esso. L'integrità referenziale tramite PK e FK non è per popolare le tabelle per te.

Il tuo codice MySql per l'inserimento di un nuovo record in Films_Genres , se è un nuovo film che corrisponde a un nuovo genere, potrebbe sembrare

 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); 

Sul lato php per get un ID appena assegnato per un field autoincrementato usa $mysqli->insert_id .

Ora se vuoi creare un nuovo film e assegnarlo a più generi contemporaneamente puoi farlo

 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'); 

Ecco la demo di SQLFiddle

Fondamentalmente, dovresti inserire una row nella tabella dei link per "colbind" un film e un genere che hai appena inserito. Il motore MySQL non lo fa automaticamente per te (semplicemente non sa che quei 2 record dovrebbero essere in qualche modo correlati) – questo deve essere fatto sul lato dell'applicazione o manualmente

 INSERT INTO Films_Genres (film_id,genre_id) VALUES (1,1) 

Devi riempire la tabella molti-a-molti, è così che funziona mysql, non ci sono lavori di supposizione automatica eseguiti qui sfortunatamente.