8

SQL テーブルの主キー カウンターをリセットし、各行を新しい主キーで更新するにはどうすればよいですか?

4

6 に答える 6

15

最初にテーブルに別の列を追加し、新しい PK を入力します。

次に、update ステートメントを使用して、関連するすべてのテーブルの新しい fk フィールドを更新します。

次に、古い PK フィールドと古い fk フィールドを削除できます。

編集:はい、イアンが言うように、すべての外部キー制約を削除してから再作成する必要があります。

于 2008-10-23T14:45:46.957 に答える
6

使用しているDBMSはわかりませんが、SQLServerの場合は次のようになります。

SET IDENTITY_INSERT [MyTable] ON

主キー列を更新/挿入できます。次に、キーの更新が完了したら(ロジックが複雑な場合は、これにカーソルを使用できます)

SET IDENTITY_INSERT [MyTable] OFF

お役に立てば幸いです。

于 2008-10-23T15:07:35.430 に答える
3

これは 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
于 2008-10-23T14:51:33.403 に答える
1

なぜあなたも気にするのですか?カウンターベースの「ID」主キーの要点は、数値が任意で無意味であるということです。

于 2008-10-23T15:20:49.570 に答える
1

次の手順でそれを行うことができます。

  • 追加の列 new_key を使用して yourTable のコピーを作成します
  • new_key の目的の値とともに、yourTable からの影響を受ける行を copyOfYourTable に入力します。
  • 制約を一時的に無効にする
  • 関連するすべてのテーブルを更新して、old_key の代わりに new_key の値を指すようにします。
  • 影響を受ける行を yourTable から削除します
  • SET IDENTITY_INSERT [yourTable] オン
  • キーの新しい適切な値を使用して、影響を受けた行を再度挿入します(コピーテーブルから)
  • SET IDENTITY_INSERT [yourTable] オフ
  • 再シードアイデンティティ
  • 拘束を再度有効にする
  • テーブルのコピーを削除します

しかし、他の人が言ったように、そのすべての作業は必要ありません。ID 型の主キーを C のポインターと同等であるかのように見る傾向があります。それらを使用して他のオブジェクトを参照しますが、それらを明示的に変更またはアクセスすることはありません。

于 2008-10-23T15:41:59.777 に答える
-1

これが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を取得します。

これが少し役立つことを願っています!

于 2008-10-23T16:10:15.053 に答える