SQL テーブルの主キー カウンターをリセットし、各行を新しい主キーで更新するにはどうすればよいですか?
6 に答える
最初にテーブルに別の列を追加し、新しい PK を入力します。
次に、update ステートメントを使用して、関連するすべてのテーブルの新しい fk フィールドを更新します。
次に、古い PK フィールドと古い fk フィールドを削除できます。
編集:はい、イアンが言うように、すべての外部キー制約を削除してから再作成する必要があります。
使用しているDBMSはわかりませんが、SQLServerの場合は次のようになります。
SET IDENTITY_INSERT [MyTable] ON
主キー列を更新/挿入できます。次に、キーの更新が完了したら(ロジックが複雑な場合は、これにカーソルを使用できます)
SET IDENTITY_INSERT [MyTable] OFF
お役に立てば幸いです。
これは MS SQL 固有のものである場合とそうでない場合がありますが、TRUNCATE TABLE は ID カウンターをリセットするため、これを手早く行う 1 つの方法は、1) バックアップを実行する 2) テーブルの内容を一時テーブルにコピーする: 3) 一時テーブルの内容をコピーするテーブルに戻ります(ID列があります):
SELECT Field1, Field2 INTO #MyTable FROM MyTable
TRUNCATE TABLE MyTable
INSERT INTO MyTable
(Field1, Field2)
SELECT Field1, Field2 FROM #MyTable
SELECT * FROM MyTable
-----------------------------------
ID Field1 Field2
1 Value1 Value2
なぜあなたも気にするのですか?カウンターベースの「ID」主キーの要点は、数値が任意で無意味であるということです。
次の手順でそれを行うことができます。
- 追加の列 new_key を使用して yourTable のコピーを作成します
- new_key の目的の値とともに、yourTable からの影響を受ける行を copyOfYourTable に入力します。
- 制約を一時的に無効にする
- 関連するすべてのテーブルを更新して、old_key の代わりに new_key の値を指すようにします。
- 影響を受ける行を yourTable から削除します
- SET IDENTITY_INSERT [yourTable] オン
- キーの新しい適切な値を使用して、影響を受けた行を再度挿入します(コピーテーブルから)
- SET IDENTITY_INSERT [yourTable] オフ
- 再シードアイデンティティ
- 拘束を再度有効にする
- テーブルのコピーを削除します
しかし、他の人が言ったように、そのすべての作業は必要ありません。ID 型の主キーを C のポインターと同等であるかのように見る傾向があります。それらを使用して他のオブジェクトを参照しますが、それらを明示的に変更またはアクセスすることはありません。
これがMicrosoftのSQLServerである場合、実行できることの1つは、[dbcc checkident](http://msdn.microsoft.com/en-us/library/ms176057(SQL.90) .aspx)を使用することです。
主キーの番号を付け直すとともに、データ内を移動する単一のテーブルがあるとします。この例では、テーブルの名前はErrorCodeです。ErrorCodeID(主キー)と説明の2つのフィールドがあります。
dbcccheckidentを使用したコード例
-- Reset the primary key counter
dbcc checkident(ErrorCode, reseed, 7000)
-- Move all rows greater than 8000 to the 7000 range
insert into ErrorCode
select Description from ErrorCode where ErrorCodeID >= 8000
-- Delete the old rows
delete ErrorCode where ErrorCodeID >= 8000
-- Reset the primary key counter
dbcc checkident(ErrorCode, reseed, 8000)
この例では、すべての行を別の主キーに効果的に移動してからリセットし、次の挿入で8000IDを取得します。
これが少し役立つことを願っています!