【问题标题】:How to migrate IDs from JOIN table into foreign key column in MySQL如何将 JOIN 表中的 ID 迁移到 MySQL 中的外键列
【发布时间】:2020-08-30 23:44:26
【问题描述】:

我的 MySQL 数据库中有以下表格:

CREATE TABLE `User` (
  `id` char(25) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email_UNIQUE` (`email`(191))
);

CREATE TABLE `Post` (
  `id` char(25) NOT NULL,
  `authorId` char(25) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `authorId` (`authorId`),
  CONSTRAINT `Post_ibfk_1` FOREIGN KEY (`authorId`) REFERENCES `User` (`id`)
);

CREATE TABLE `_PostToUser` (
  `A` char(25) CHARACTER SET utf8 NOT NULL,
  `B` char(25) CHARACTER SET utf8 NOT NULL,
  UNIQUE KEY `PostToUser_AB_unique` (`A`,`B`),
  KEY `B` (`B`),
  CONSTRAINT `_PostToUser_ibfk_1` FOREIGN KEY (`A`) REFERENCES `Post` (`id`) ON DELETE CASCADE,
  CONSTRAINT `_PostToUser_ibfk_2` FOREIGN KEY (`B`) REFERENCES `User` (`id`) ON DELETE CASCADE
);

UserPost 之间的关系现在通过_PostToUser JOIN 表进行管理。

但是,我想摆脱这个额外的 JOIN 表,只需要一个从 PostUser 的外键引用,所以我运行了这个查询来创建外键:

ALTER TABLE `Post` ADD COLUMN `authorId` char(25);
ALTER TABLE `Post` ADD FOREIGN KEY (`authorId`) REFERENCES `User` (`id`);

现在,我想知道需要运行什么 SQL 查询才能将数据从 JOIN 表迁移到新的 authorId 列?如果我理解正确,我需要一个查询来读取_PostToUser 关系表中的所有行以及每一行:

  1. 通过查找列A 中的值来查找相应的Post 记录
  2. 将列 B 中的值作为 authorId 的值插入到该 Post 记录中

请注意,我知道这会将关系从 m-n 更改为 1-n:一篇文章最多只能有一个作者。一位作者/用户可以写多篇文章。


我基本上是在寻找 此 PostgreSQL 语句的等效项

UPDATE "Post" post
SET "authorId" = post_to_user."B"
FROM "_PostToUser" post_to_user 
WHERE post_to_user."A" = post."id";

【问题讨论】:

  • 当前方案允许“每个用户多个帖子”(1)和“每个帖子多个用户”(2)。实现 我想摆脱这个额外的 JOIN 表,只需从 Post 到 User 的外键引用,您将失去第二种可能性。
  • 谢谢,我知道了,请看帖子最后一句:)

标签: mysql sql


【解决方案1】:
  1. 确保_PostToUser.A 值是唯一的(没有重复值)。如果存在 - 编辑您的数据(例如,删除多余的记录)。
  2. 执行
UPDATE Post, _PostToUser
SET Post.authorId = _PostToUser.B
WHERE Post.id = _PostToUser.A
  1. 确保Post.authorId 中没有空值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2020-03-13
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多