2009-05-11 8 views
1

私はあなたのためにSQL gurusをすばやく質問します。プライマリキー列を持たない既存のテーブルがあり、IDが設定されていません。今は、既存の整数列を主キーとして作成し、その列にID値を追加することで、これらの表を変更しようとしています。私の質問は、まずそれらの変更を行う前に、テーブルから一時テーブルにすべてのレコードをコピーする必要があります。 T-SQLコマンドラインを実行して主キーを作成し、これらのテーブルにID列を追加すると、以前のすべてのレコードが失われますか。何のアプローチは、私が)このようなテーブルからすべてのレコードをコピーする一時テーブルを作成しますデータがロードされた後にプライマリキーとID列を作成する

1)としてTEMPTABLE 3に 2)負荷のすべてのレコードを修正するために取るテーブルスキーマの変更を行う必要があります 4 )最後に、tempテーブルのレコードを元のテーブルにロードします。

または

この方法がありますか?私は本当にあなたの既存の整数列がユニークかつ適切な場合には、PKに変換する問題はないはずです

おかげ

答えて

3

テーブルにあまりにも多くのレコードがありません。 Management Studioを使用して既存のフィールドをIDに変更すると、IDフィールドが設定された別のテーブルが作成されます。 IDの挿入をオンにし、元のテーブルからのレコードをinseretsし、IDの挿入をオフにします。次に、古いテーブルを削除し、作成したテーブルの名前を変更します。これは、多くのレコードがある場合はかなり長い処理になります。もしそうなら、私はこれをスクリプト化して、あなたがこれをしている間にテーブルが完全にロックされるので、休業時間に実行される仕事でそれを行います。

+0

ありがとう、私は本当にあなたの答えが好きでした。 – Shiva

0

あなたの助けに感謝します。

もう1つの方法として、既存の列を使用しない場合は、新しいPK列をメイン表に追加し、それを投入してシードしてから、新しいPKで他のすべての表を更新するupdate文を実行できます。

どのようなやり方でも、まずバックアップを取ってください!

2

すべての変更を管理スタジオで行い、生成されたスクリプトをファイルにコピー/ペーストします。この時点で変更を保存しないでください。必要に応じてそのスクリプトを調べて編集すれば、元のテーブルを削除して元の名前に変更しますが、すべての制約とFKも処理できます。

+0

もう1つの追加のヒントは、それをnigthで実行するためのスクリプトを作成するのに役立ちます..ありがとう –

4

[ツール]> [オプション]>デザイナー>テーブルおよびデータベースデザイナ

のチェックを外し、「防止表の再作成が必要な変更を保存」

は、[編集]私は人口のテーブルでこれを試してみたと私はしませんでしたデータは失われますが、これについてはあまりよく分かりません。

+0

チップのおかげで...それは私の時間がクエリをdoind時間を節約:) –

0

IDENTITY列は、データのコピーが完了した後でもいつでも追加できます。また、IDENTITYシードを最大整数+ 1にリセットすることもできます。これはあなたの問題を解決するはずです。 nはあなたがアイデンティティがで開始する番号です

DBCC CHECKIDENT( 'MyTableという'、RESEED、n)は

関連する問題