2011-07-18 21 views
0

Excelスプレッドシートからかなり複雑なリレーショナルデータベースにデータをエクスポートしようとしています。スプレッドシートは、他のオブジェクトの名前を示すことによって「外部キー」を示します。 (幸いにも、私はスプレッドシートをいくつかコントロールしているので、これらの名前が一意であり、それらが参照するオブジェクトが実際に存在することを保証することができます)。既存のデータベースに外部キーを追加する

私はMSSqlデータベースでこれらのテーブルを再作成することができるプログラムを持っていますが、自動的にそれらを相互にリンクすることはできません。また、データベースのサイズが大きくなるため、オブジェクトの実際の名前をプライマリキーとして使用する必要はありません。

"名前"フィールドで相互に参照する既存の、しかし未接続のテーブルがたくさんある場合、そのIDでリンクする外部キーを追加するにはどうすればよいですか?

私が持っているものの簡易版:

Parent 
ID: 1 (PK) 
Name: Mary 

Child 
ID: 2 (PK) 
Name: Jane 
ParentName: Mary 

そして、何私が達成したい:任意の助け

Child 
ID: 2 (PK) 
Name: Jane 
ParentID: 1 (FK) 

感謝を!私は事実の後に、あるいは別のフィールドで外部キーマッピングを追加する方法の例を見つけることができませんでした。

+0

これは一度だけのことですか、このスプレッドシートから定期的にデータをインポートする必要がありますか? –

+0

@キャットコール:私はそれを定期的にやる必要があります。 –

答えて

4

MSSQLの構文ALTER TABLEを参照してください。あなたは、テーブルに制約を追加するには、このような何かを思い付くことができます。

ALTER Child 
ADD CONSTRAINT Child_Parent_FK FOREIGN KEY (ParentID) REFERENCES Parent(ID) 

次に制約がでていると、何かしてみてください:あなたはNameを保証することができれば動作するはずです

UPDATE Child 
SET ParentID = (SELECT ID FROM Parent WHERE Name = ParentName) 

を親のそれ以外の場合は、クエリの最後にLIMIT 1を追加できます。しかし、同じNameの複数の親がいる場合は、余分なロジック(元の投稿には指定されていません)を追加する必要があります。

+0

これはどのようにして質問に答えますか? – Olaf

+0

ああ、そうです。私はそれが少し欠けていると思います。もう少し追加しましょう。 – Dirk

+0

OPが直面している問題は、Excelスプレッドシートに親の名前が含まれていることですが、データベーステーブルには親のIDが含まれている必要があります。 – Olaf

1

これを定期的に行う予定であるため、ステージングテーブルにインポートする必要があります。私は自分のスキーマでステージングテーブルを分離するのが好きです。

ステージングテーブルを使用して必要なキーを取得または生成し、ステージングテーブルのデータに基づいてOLTPテーブルを挿入または更新します。最後に、ステージングテーブルを切り捨てます。

+0

ありがとう!これは私の元の質問に対する直接的な答えではありませんが、私がやったことです。 :) –

+0

これは私の最初のロデオではありません。私は質問に答えることと問題を解決することの違いを知っています。 (http://meta.stackexchange.com/q/66377/161666を参照してください)私はポイントを求めていませんが、あなたが好きな答えをupvoteすることができ、あなたはいつでもあなたの受け入れられた答えを変更することができます。 –

+0

十分な "評判"を得るとすぐに私はこの提案を間違いなくupvoteします! :) –

関連する問題