6

やあみんな。DBに、約1,000個のレコードを含むテーブルがあります。すべてのIDが再びシーケンシャルになるように、ID列をリセットしたいと思います。私はこれを見ていましたが、それは空のテーブルでのみ機能すると仮定しています

現在のテーブル

ID    |    Name
1           Joe
2           Phil
5           Jan
88          Rob

希望のテーブル

ID    |    Name
1           Joe
2           Phil
3           Jan
4           Rob

前もって感謝します

4

6 に答える 6

5

最も簡単な方法は、現在のテーブルのコピーを作成し、親IDの問題を修正し、それを削除してから、新しいテーブルの名前を変更することです。

を一時的に削除して、次のことIDENTITYを試すこともできます。

;WITH TBL AS
(
  SELECT *, ROW_NUMBER(ORDER BY ID) AS RN
  FROM CURRENT_TABLE
)
UPDATE TBL
SET ID = RN

または、レコードの順序を気にしない場合は、これ

DECLARE INT @id;
SET @id = 0;

UPDATE CURRENT_TABLE
SET @id = ID = @id + 1;
于 2010-05-08T00:31:17.793 に答える
3

一方向、これをトランザクションでラップします

select id,name into #temp from YourTable

      truncate table YourTable

      insert YourTable (name)
      select name from #temp
于 2010-05-08T00:38:18.650 に答える
1

IDフィールドをリセットする方法は次のとおりです。上記のバージョンのCTE(共通テーブル式)はやり過ぎです。現在の行番号を使用して、結合を含む単純な更新ステートメントを使用してID列を更新するだけです。

UPDATE [YourTable] SET ID = rn.RowNumber FROM [YourTable]
JOIN (SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber
  FROM [YourTable]) rn ON rn.ID = [YourTable].ID

このステートメントは、さらに単純になるようにリファクタリングされる場合があります。もしそうなら、私はより単純なバージョンを見たいと思います。

これが誰かに役立つことを願っています。

于 2010-10-28T18:38:14.510 に答える
1

迅速な解決策は次のとおりです。

  1. 同じスキーマで新しいテーブルを作成する
  2. 古いテーブルを新しいテーブルにコピーします(ID列を除く)
  3. 古いテーブルを削除します
  4. 新しいテーブルの名前を変更します
于 2010-05-08T00:33:35.000 に答える
1

(コメントごとに)同じテーブルに外部キーがあるため、古いものから新しいものへのマッピングをどこかに保存し、新しいIDに一致するように外部キーを復元する必要があります。

これを行うにはいくつかのアプローチがありますが、特にそれらを参照する外部キーがすでにあり、それは単なる代理キーであるため、主キーを更新する必要性を強く疑うでしょう。代理キーをGUIDなどの特別なものに変更しているわけではありません。

于 2010-05-08T00:38:11.350 に答える
-1

DBCCCHECKIDENTを使用します。テーブルは空である必要はありません。

  • DBCC CHECKIDENT ( table_name, NORESEED)

現在のID値はリセットされません。DBCC CHECKIDENTは、ID列の現在のID値と現在の最大値を返します。2つの値が同じでない場合は、ID値をリセットして、値のシーケンスの潜在的なエラーやギャップを回避する必要があります。

  • DBCC CHECKIDENT ( table_name )またDBCC CHECKIDENT ( table_name, RESEED )

テーブルの現在のID値が、ID列に格納されている最大ID値よりも小さい場合、ID列の最大値を使用してリセットされます。

  • DBCC CHECKIDENT ( table_name, RESEED, new_reseed_value )

現在のID値はnew_reseed_valueに設定されます。テーブルが作成されてからテーブルに行が挿入されていない場合、またはTRUNCATE TABLEステートメントを使用してすべての行が削除されている場合、DBCCCHECKIDENTの実行後に挿入される最初の行はnew_reseed_valueをIDとして使用します。それ以外の場合、挿入される次の行はnew_reseed_value+現在の増分値を使用します。

テーブルが空でない場合、ID値をID列の最大値よりも小さい数値に設定すると、次のいずれかの状態になる可能性があります。

  • PRIMARY KEYまたはUNIQUE制約がID列に存在する場合、生成されたID値が既存の値と競合するため、後のテーブルへの挿入操作でエラーメッセージ2627が生成されます。

  • PRIMARY KEYまたはUNIQUE制約が存在しない場合、後の挿入操作でID値が重複します。

于 2010-05-08T00:25:11.083 に答える