【问题标题】:MySQL: insert data in tables with foreign keysMySQL:在具有外键的表中插入数据
【发布时间】:2014-01-12 22:00:05
【问题描述】:

在 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

【问题讨论】:

  • 在将行插入tagsprojects 之后,您必须插入tags_posts LAST。
  • 当然,这听起来很合理!但是,除此之外,我的查询是否有效?

标签: mysql database foreign-keys


【解决方案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演示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    相关资源
    最近更新 更多