2013-07-03 11 views
10

Sto cercando di creare una relazione molti-a-molti nel mio database MySQL. Ho tre tabelle: Films, Genres e Films_Genres. Sto usando il seguente codice per configurarli:Relazione molti-a-molti con MySQL KEYS ESTERO

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 ad inserire alcuni valori nelle tabelle con:

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

riesco a vedere il nuovo film in Films tavolo e la nuovo genere nella tabella Genres ma la tabella Films_Genres non si aggiorna - non ci sono nuove righe (sto verificando tramite phpMyAdmin).

Cosa sto sbagliando?

+0

Incolla il codice PHP o non possiamo aiutarti. Hai verificato che '$ title' e' $ genre' esistano? Ecc .. –

+0

Posso mostrare i risultati di film e generi - funzionano. L'unico problema è che la tabella Films_Genres non aggiunge alcuna riga. PHP sembra a posto. Sto usando mysqli_query ($ con, $ sql) per eseguire il codice SQL. L'SQL è corretto? – Sharkz

+0

Quindi presumo che la connessione in 'Films_Genres 'sia la tua domanda preoccupata. In tal caso, dovrai mettere in relazione te stesso quei due record. –

risposta

15

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

Il codice MySql per l'inserimento di un nuovo record nel Films_Genres, se si tratta di un nuovo film, che corrispondono a un nuovo genere, potrebbe essere simile

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 ottenere un ID di recente assegnato per una autoincremented campo utilizzare $mysqli->insert_id.

Ora, se si desidera creare un nuovo film e assegnarlo a più generi in una sola volta si può fare

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 SQLFiddle demo

+0

Wow! Non potevo aspettarmi un analfabeta migliore! Molte grazie! Adoro StackOverflow: D – Sharkz

+0

@Sharkz Benvenuto :) Vedi la risposta aggiornata per ulteriori informazioni. – peterm

0

In sostanza, si dovrebbe inserire una riga nella anche la tabella dei link per 'collegare' un film e un genere che hai appena inserito.Mysql engine non lo fa automaticamente per te (semplicemente non sa che quei 2 record dovrebbero essere in qualche modo correlati) - questo è per da eseguire sul lato dell'applicazione o manualmente

0

Devi riempire la tabella molti-a-molti, è così che funziona mysql, non c'è lavoro di supposizione automatica qui svolto purtroppo.