Sha*_*rkz 12 php mysql sql many-to-many foreign-keys
我试图在我的MySQL数据库中创建多对多关系.我有三个表:
Films
, Genres
和Films_Genres
.我使用以下代码进行设置:
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
)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在表中插入一些值时:
INSERT INTO Films (Title) VALUES ('$title')
INSERT INTO Genres (Name) VALUES ('$genre')
Run Code Online (Sandbox Code Playgroud)
我可以看到Films
表格中的新电影和表格中的新类型,Genres
但Films_Genres
表格没有更新 - 没有新行(我正在通过phpMyAdmin检查).
我究竟做错了什么?
pet*_*erm 16
在Films_Genres
明确插入内容之前,您不会在表格中看到任何内容.通过PK和FK的参照完整性不适合为您填充表格.
用于插入新记录的MySql代码Films_Genres
,如果它是一部对应于新类型的新电影,可能看起来像
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);
Run Code Online (Sandbox Code Playgroud)
在php端获取自动增量字段使用的新分配ID $mysqli->insert_id
.
现在,如果您想创建一部新电影并立即将其分配给多个类型,您可以这样做
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');
Run Code Online (Sandbox Code Playgroud)
这是SQLFiddle演示
归档时间: |
|
查看次数: |
28688 次 |
最近记录: |