2014-01-12 87 views
1

在MySQL中,我有三个表:projects,tagstags_postsMySQL:在外键表中插入数据

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

当然,我想将项目添加到数据库。我已经了解到START TRANSACTION;COMMIT;,这样查询将完全执行,或根本不执行。 但是,我必须使用什么查询将INSERT,SELECTUPDATE数据同时用于这三个表格?

我曾想过使用: 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工作台提供了一个错误1452:外键约束失败。 PHPMyAdmin挂起执行此查询。 谁可以帮我使用正确的查询INSERT,UPDATESELECT这三张表? ER Diagram of the three tables mentioned

+0

将行插入'tags'和'projects'后,您必须在'tags_posts'最后插入'tags_posts'。 –

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