MySQL:在带有外键的表中插入数据

时间:2014-01-12 22:00:05

标签: mysql database foreign-keys

在MySQL中,我有三个表:projectstagstags_posts

tags_postsprojectstags之间的一个表,其中包含project_idtag_id作为外键。这样,我就可以轻松选择project_id = x的所有标记,或选择tag_id = y的所有项目。

当然,我想将项目添加到数据库中。我已经了解了START TRANSACTION;COMMIT;,因此查询将完全执行,或者根本不执行。 但是我必须同时使用哪些查询INSERTSELECTUPDATE数据到这三个表?

我考虑过使用: INSERT INTO projects([column-1], [column-2], [column-N]) VALUES([value-1], [value-2], [value-N]);

INSERT INTO tags_posts(tag_id, project_id) VALUES(1, LAST_INSERT_ID());

INSERT INTO tags(tag_id, tag_name) VALUES(LAST_INSERT_ID(), 'php');

MySQL Workbench给出错误1452:外键约束失败。 PHPMyAdmin在执行此查询时挂起。 谁可以帮助我对这三个表格使用INSERTUPDATESELECT的正确查询? ER Diagram of the three tables mentioned

1 个答案:

答案 0 :(得分:1)

您必须先插入父(projectstags)行,然后添加对多对多表tags_posts的引用。

您的代码可能如下所示

START TRANSACTION;
-- Add a project
INSERT INTO projects(title, description, datum) VALUES ('title1', 'description1', CURDATE());
SET @project_id  = LAST_INSERT_ID();
-- Add a tag 
INSERT INTO tags (tag_name) VALUES ('tag1');
SET @tag_id = LAST_INSERT_ID();
-- Now add a tag to the project
INSERT INTO tags_posts (tag_id, project_id) VALUES (@tag_id, @project_id);
COMMIT;

这是 SQLFiddle 演示


如果您需要添加标签,然后使用此标签添加多个项目,则可以执行

START TRANSACTION;
INSERT INTO tags (tag_name) VALUES ('tag1');
SET @tag_id = LAST_INSERT_ID();

INSERT INTO projects(title, description, datum) VALUES ('title1', 'description1', CURDATE());
INSERT INTO tags_posts (tag_id, project_id) VALUES (@tag_id, LAST_INSERT_ID());

INSERT INTO projects(title, description, datum) VALUES ('title2', 'description2', CURDATE());
INSERT INTO tags_posts (tag_id, project_id) VALUES (@tag_id, LAST_INSERT_ID());
COMMIT;

这是 SQLFiddle 演示