【发布时间】: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
);
User 和Post 之间的关系现在通过_PostToUser JOIN 表进行管理。
但是,我想摆脱这个额外的 JOIN 表,只需要一个从 Post 到 User 的外键引用,所以我运行了这个查询来创建外键:
ALTER TABLE `Post` ADD COLUMN `authorId` char(25);
ALTER TABLE `Post` ADD FOREIGN KEY (`authorId`) REFERENCES `User` (`id`);
现在,我想知道需要运行什么 SQL 查询才能将数据从 JOIN 表迁移到新的 authorId 列?如果我理解正确,我需要一个查询来读取_PostToUser 关系表中的所有行以及每一行:
- 通过查找列
A中的值来查找相应的Post记录 - 将列
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 的外键引用,您将失去第二种可能性。
-
谢谢,我知道了,请看帖子最后一句:)