4


0

代理キーを関連テーブルに追加する方法は?

データウェアハウスの3つのテーブルにauto-inc代理キーを追加する必要があります。

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

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

JakToRoad(JakMasterId、日付)(FK)

JakToBig(JakMasterId、日付)(FK) _ _

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

ありがとうございます。

2 Answer


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


1


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

  1. テーブルを変更して、代理キー列を作成します。 を除いて、それはする必要があります null可能です。

  2. キー値を設定する小さなプログラムを作成します。 ループしている 更新。

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

ここで、FKを作成する必要があります。

  1. テーブルを変更してFK列を追加します。 繰り返しますが、それはNULL可能でなければなりません。

  2. FK列を設定する小さなプログラムを作成します。 これはSELECT(取得する 非サロゲートキーに基づくPK行)、および参照元テーブルへの更新。

  3. 必要に応じて、テーブルを変更してFKを非ヌルにします。 これは違います 常に必要であり、FKテーブルとPKテーブルの関係の定義に依存します。

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