21

最近、PostgreSQLデータベースからSQLServerデータベースに移行しました。データを切り替えるには、IDENTITY_INSERTを有効にする必要がありました。いずれかのテーブルに挿入を行うと、ID値(主キーとして設定されている)が重複しているために、あらゆる種類の奇妙なエラーが発生することがわかりました。

私はかなりの数のテーブルを持っています。すべてのテーブルのIDを自動的に再シードして、後になるようにする最も簡単な方法は何でしょうmax(RID)か。

4

5 に答える 5

33

このリンクの情報を、リセットする必要がある各テーブルから max(RID) を取得する SQL 関数と組み合わせて使用​​します。たとえば、主キー シードを 25000 から開始する場合は、次のコードを使用します (StartSeedValue - 1)。

DBCC CHECKIDENT('myTable', RESEED, 24999)

したがって、組み合わせて、次のようなものになるはずです

DECLARE @maxVal INT
SELECT @maxVal = ISNULL(max(ID),0)+1 from mytable
DBCC CHECKIDENT('mytable', RESEED, @maxVal)

疑似コードで申し訳ありません。SQL関数を書いてからしばらく経ちました:)

編集:

キャッチしてくれてありがとう、INTEGERをINTに変更しました

USE YourDBName
GO 
SELECT *
FROM sys.Tables
GO 

これにより、データベース内のすべてのユーザー テーブルの一覧が表示されます。このクエリを「ループ」として使用すると、すべてのテーブルのシードをリセットできるようになります。

于 2010-05-27T18:43:36.913 に答える
16

トミーの答えは正しいですが、ドキュメントを正しく読んでいる場合、これは次のように単純化できます。

DBCC CHECKIDENT ('myTable')

ドキュメントによると:

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

これにより、最大 ID を手動で検索する必要がなくなり、SQL Server 2005 以降でサポートされます。

これは、元の OP ケースで機能するはずです。ただし、ドキュメントには、これが機能しない 2 つのケースが記載されており、手動で最大 ID 値を調べて Tommy のソリューションにフォールバックする必要があります。

  • 現在の ID 値がテーブルの最大値を超えています。
  • テーブルからすべての行が削除されます。
于 2015-11-01T22:20:06.520 に答える
6

おそらく最も簡単な方法は (クレイジーに聞こえるかもしれませんが、見た目がコード臭いかもしれません)、次のDBCC CHECKIDENTように 2 回実行することです。

-- sets all the seeds to 1
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'', RESEED, 1)'

-- run it again to get MSSQL to figure out the MAX/NEXT seed automatically
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'')'

終わり。

必要に応じて、もう一度実行して、すべてのシードがどのように設定されているかを確認できます。

-- run it again to display what the seeds are now set to
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'')'

これは、ドキュメントのコメントを利用するための創造的な方法です。

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

于 2016-11-02T16:09:54.213 に答える
0

ロールバック ケース -

私は自分のデータベースでテストしましたが、以前にここにリストされているこのコードを使用した場合にのみ機能します (+1 を変更して - これは必要ありません)。

DECLARE @maxVal INT
SELECT @maxVal = ISNULL(max(codsequencia),0) from teste_sequencial
DBCC CHECKIDENT(teste_sequencial, RESEED, @maxVal)

'ISNULL' 部分の後に +1 を入れると、次の ID 列が +1 にジャンプすることに注意してください。 +12。

および、コード:

DBCC CHECKIDENT (teste_sequencial)

Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'')'

ロールバックの場合、私にとってはまったくうまくいきませんでした。トランザクションを開いてロールバックを実行すると、再シードはトランザクションで使用された最後の番号から開始されます。

于 2016-11-29T15:58:17.823 に答える