4

データウェアハウスの3つのテーブルに自動インクサロゲートキーを追加する必要があります。

注:これらは実際のテーブル名ではありません

JakMaster(JakMasterId、Date)(PK)注:JakMasterIdはvarchar(60)です

JakToRoad(JakMasterId、Date)(FK)

JakToBig(JakMasterId、Date)(FK)

新しいキーが相互に正しく参照するように、これら3つのテーブルに代理キーを追加するにはどのような手順を実行する必要がありますか?

ありがとう!

4

2 に答える 2

3

JakMasterIdを自動インクリメントフィールドに置き換えて、他の2つのテーブルにvarchar(60)フィールドを必要とせず、クエリ時間を改善したいとしますが、情報としてJakMasterIdを保持していると仮定します。

-- set database single-user

-- drop foreign keys

create table NewMaster (ID int identity(1, 1), JakMasterId, Date))
insert NewMaster(JakMasterId, Date) select JakMasterId, Date from JakMaster
drop table JakMaster
sp_rename 'NewMaster', 'JakMaster'

alter table JakToRoad add MasterId int
alter table JakToBig add MasterId int

update JakToRoad set MasterId = JakMaster.ID
from JakToRoad
inner join JakMaster on JakMaster.JakMasterId = JakToRoad.JakMasterId

update JakToBig set MasterId = JakMaster.ID
from JakToBig 
inner join JakMaster on JakMaster.JakMasterId = JakToBig .JakMasterId

alter table JakToRoad drop column JakMasterId
alter table JakToBig drop column JakMasterId


alter table JakToRoad add constraint FK_JTRtoJM foreign key (MasterId) references JakMaster (ID)
alter table JakToBig add constraint FK_JTBtoJM foreign key (MasterId) references JakMaster (ID)

-- reset database to multi-user
于 2010-10-14T20:15:57.720 に答える
1

DB内でこれを3つのステップで実行して、代理PKを作成できる場合があります。

  1. テーブルを変更して、代理キー列を作成します。ただし、null許容である必要があります。

  2. キー値を設定する小さなプログラムを作成します。これは、UPDATEを実行するループです。

  3. テーブルを変更して、代理キー列をnull以外、自動インクリメント、インデックス付き、一意などにします。

次に、FKを作成する必要があります。

  1. テーブルを変更してFK列を追加します。繰り返しますが、null許容である必要があります。

  2. FK列を設定する小さなプログラムを作成します。これはSELECT(非代理キーに基づいてPK行を取得するため)であり、参照テーブルへのUPDATEです。

  3. 必要に応じて、テーブルを変更してFKをnull以外にします。これは必ずしも必要ではありません。FKテーブルとPKテーブルの関係の定義によって異なります。

他のすべてのテーブルに対してFKの作成を繰り返します。

于 2010-10-14T17:16:22.487 に答える