2016-09-25 8 views
0

私はあるMySQL DBから別のMySQL DBにアプリケーションデータを移行しようとしています(もちろん別のスキーマを使用しています)、古いDBから新しいDBへの関係を維持しようとすると問題に陥ります。MySQLデータを移行して新しいFKを検索しますか?

構造

基本的な考え方は、異なるグループ/部門がこれらのイベントのためのイベントやシフトを作成することができますイベント管理システム、です。私は(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) 

移行部門とイベント物事をシンプルに保つために、関連する列を示しています

DB構造

INSERT...SELECTクエリと非常に簡単でした。シフトのために、よく...これは私がこれまで持っているものです:私は関係連鎖の頂点で開始し、(DEPT_IDが@oldDeptId変数に設定されている)1つの部門を移行し

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; 

、その後、すべてのイベントを移行類似のINSERT...SELECTクエリを使用してこの部門からさて、私は古いシフトデータをコピーするときに、更新されたnewDB.events.idの値と一致するようにnewDB.shifts.event_idの値が必要です。この値は、オートインクリメント値として割り当てられて、関係を維持します。

サブクエリは、oldDB.Event.Event_IDと一致するすべてnewDB.event.idを返しますが、サブクエリは1つの結果しか返すことができません(MySQLエラー1242)。

私は適切な道にいるのですか、これを行うには良い方法がありますか?ありがとう!

+0

クエリには、テーブル定義に表示されない「start」などの列が含まれているのはなぜですか?新しい 'shiftts'テーブルに挿入される' event_id'値を決定するために使用しようとしているロジックについて詳しく説明できますか? –

+0

@TimBiegeleisen私は本当に関係の感覚を与えることを試みる構造の主要な/外来のキーを含んでいました。各テーブルには、私が重要だとは思わなかったいくつかの他の列(タイトル、アドレス、開始/終了時刻など)があります。私は最後の段落で何をしようとしているのかを広げました。 – Jason

答えて

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を一時的に追加し、古いテーブルから新しいpkを取得するにはjoinを一時的に追加できますどんなシナリオでも。たとえば、単純に使用する

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; 
+0

ありがとう、これらは私が使用できると考えていなかった両方のものです。部門ごとではなくテーブル全体を移行する方が簡単だと私は同意しますが、引き続きアプリケーションを使用する部門のデータのみを移動したいと考えています。私はこの作業を適切な 'WHERE'節でうまくいくことができると確信しています。再度、感謝します! – Jason

+0

@Jasonはい、あなたは 'WHERE S.Dept_ID = @ oldDeptId'を再度追加して、部門ごとに行うことができます。あなたの移行に幸運。 – Solarflare

関連する問題