Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Relação muitos-para-muitos do MySQL com FOREIGN KEYS


Você não verá nada em Films_Genres table até que você insira explicitamente algo nela. A integridade referencial através de PK e FK não serve para preencher suas tabelas para você.

Seu código MySql para inserir um novo registro em Films_Genres , se for um novo filme que corresponde a um novo gênero, pode parecer
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);

No lado do php, para obter um ID recém-atribuído para um campo autoincrementado, use $mysqli->insert_id .

Agora, se você quiser criar um novo filme e atribuí-lo a vários gêneros ao mesmo tempo, você pode fazer
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');

Aqui está SQLFiddle demonstração