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.