在MySQL中,我有三个表:projects
,tags
和tags_posts
。
tags_posts
是projects
和tags
之间的一个表,其中包含project_id
和tag_id
作为外键。这样,我就可以轻松选择project_id = x
的所有标记,或选择tag_id = y
的所有项目。
当然,我想将项目添加到数据库中。我已经了解了START TRANSACTION;
和COMMIT;
,因此查询将完全执行,或者根本不执行。
但是我必须同时使用哪些查询INSERT
,SELECT
和UPDATE
数据到这三个表?
我考虑过使用:
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在执行此查询时挂起。
谁可以帮助我对这三个表格使用INSERT
,UPDATE
或SELECT
的正确查询?
答案 0 :(得分:1)
您必须先插入父(projects
和tags
)行,然后添加对多对多表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 演示