gpt4 book ai didi

mysql - 迁移 MySQL 数据并查找新的 FK?

转载 作者:行者123 更新时间:2023-11-29 11:16:17 24 4
gpt4 key购买 nike

我正在尝试将应用程序数据从一个 MySQL 数据库迁移到另一个(当然,使用不同的架构),但在尝试维护从旧数据库到新数据库的关系时遇到了麻烦。

结构

基本思想是一个事件管理系统,不同的小组/部门可以在其中创建事件并为这些事件轮类。

数据库结构

我只显示相关列以使事情简单(r)

*Old DB*
Departments (PK Dept_ID)
Events (PK Event_ID, FK Dept_ID)
Shifts (PK Shift_ID, FK Event_ID, FK Dept_ID)

*New DB*
departments (PK id)
events (PK id, FK department_id)
shifts (PK id, FK event_id)

使用 INSERT...SELECT 查询迁移部门和事件非常简单。对于轮类,嗯...这就是我到目前为止所拥有的:

INSERT INTO newDB.shifts (event_id, start, end, notes)
SELECT
(SELECT C.id FROM newDB.events C INNER JOIN oldDB.events E
ON E.Title = C.title AND E.StartTime = C.start_time AND E.Location = C.location),
* title, start, end combination is unique *
Start, End, Notes FROM oldDB.shifts S
WHERE S.Dept_ID = @oldDeptId;

我从关系链的顶部开始迁移单个部门(Dept_ID 在 @oldDeptId 变量中设置),然后使用类似的 INSERT...SELECT 查询迁移该部门的所有事件。现在,当我复制旧的类次数据时,我需要 newDB.shifts.event_id 值来匹配更新的 newDB.events.id 值,该值被分配为自动增量维持关系的值(value)。

INNER JOIN 子查询按预期返回与正确 oldDB.Event.Event_ID 匹配的所有 newDB.event.id,但是子查询只能返回一个结果(MySQL 错误 1242)。

我走在正确的道路上吗?或者有更好的方法吗?谢谢!

最佳答案

您的内部查询返回一个完整的表,而您只能在那里获取单个值(这就是您的错误消息所说的)。如果 title, start, end 确实是唯一的,您可以在 join 中使用它来获取新的 pk,例如

INSERT INTO newDB.shifts (event_id, start, end, notes)
SELECT C.id, S.Start, S.End, S.Notes
from oldDB.shifts S
join oldDB.events E
on E.Event_ID = S.Event_ID
join newDB.events C
on E.Title = C.title AND E.StartTime = C.start_time AND E.Location = C.location;

您不需要为每个部门执行此操作,您可以将表作为一个整体进行迁移。

如果标题、开始、结束不是唯一的(或者作为 future 的通用想法),您可以临时将旧的 pks 添加到新表中,然后加入 在这些上从旧的PK中获得新的PK - 因为它们在任何场景中都是独一无二的。然后您可以例如只需使用

INSERT INTO newDB.shifts (event_id, start, end, notes)
SELECT C.id, S.Start, S.End, S.Notes
from oldDB.shifts S
join newDB.events C
on C.old_event_id = S.event_id;

关于mysql - 迁移 MySQL 数据并查找新的 FK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39685937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com