質問

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

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

jakmaster(jakmasterid、date)(pk) 注:jakmasteridはvarchar(60)です

Jaktoroad(Jakmasterid、date)(fk)

Jaktobig(Jakmasterid、date)(fk)

これらの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

他のヒント

DB内の3つのステップでこれを行うことができるかもしれません。代理PKを作成する

  1. テーブルを変更して、サロゲートキー列を作成します。ただし、それはめまいでなければなりません。

  2. キー値を設定するための小さなプログラムを作成します。更新を行うループです。

  3. テーブルを変更して、サロゲートキー列を非ヌル、自動インクリメント、インデックス、一意などにします。

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

  1. テーブルを変更してFK列を追加します。繰り返しますが、それは気付かれないに違いありません。

  2. FK列を設定するための小さなプログラムを作成します。これは、[非スロゲートキーに基づいてPK行を取得するため)のselectと、参照テーブルの更新です。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top