我试图将应用程序数据从一个MySQL数据库迁移到另一个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
值,该值被指定为自动增量值以维持关系。
INNER JOIN
子查询按预期返回与正确newDB.event.id
匹配的所有oldDB.Event.Event_ID
,但子查询只能返回一个结果(MySQL错误1242)。
我是在正确的轨道上,还是有更好的方法来做到这一点?谢谢!
答案 0 :(得分:1)
您的内部查询返回一个完整的表,而您只能在那里获得一个值(这是您的错误消息所说的)。如果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;
您不需要为每个部门执行此操作,您可以将表作为一个整体进行迁移。
如果title, start, end
不是唯一的(或者作为将来的通用构思),您可以暂时将旧的pks添加到新表中,并在这些表上添加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 newDB.events C
on C.old_event_id = S.event_id;