最近、PostgreSQLデータベースからSQLServerデータベースに移行しました。データを切り替えるには、IDENTITY_INSERTを有効にする必要がありました。いずれかのテーブルに挿入を行うと、ID値(主キーとして設定されている)が重複しているために、あらゆる種類の奇妙なエラーが発生することがわかりました。
私はかなりの数のテーブルを持っています。すべてのテーブルのIDを自動的に再シードして、後になるようにする最も簡単な方法は何でしょうmax(RID)
か。
最近、PostgreSQLデータベースからSQLServerデータベースに移行しました。データを切り替えるには、IDENTITY_INSERTを有効にする必要がありました。いずれかのテーブルに挿入を行うと、ID値(主キーとして設定されている)が重複しているために、あらゆる種類の奇妙なエラーが発生することがわかりました。
私はかなりの数のテーブルを持っています。すべてのテーブルのIDを自動的に再シードして、後になるようにする最も簡単な方法は何でしょうmax(RID)
か。
このリンクの情報を、リセットする必要がある各テーブルから 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
これにより、データベース内のすべてのユーザー テーブルの一覧が表示されます。このクエリを「ループ」として使用すると、すべてのテーブルのシードをリセットできるようになります。
トミーの答えは正しいですが、ドキュメントを正しく読んでいる場合、これは次のように単純化できます。
DBCC CHECKIDENT ('myTable')
ドキュメントによると:
テーブルの現在の ID 値が ID 列に格納されている最大 ID 値より小さい場合、ID 列の最大値を使用してリセットされます。
これにより、最大 ID を手動で検索する必要がなくなり、SQL Server 2005 以降でサポートされます。
これは、元の OP ケースで機能するはずです。ただし、ドキュメントには、これが機能しない 2 つのケースが記載されており、手動で最大 ID 値を調べて Tommy のソリューションにフォールバックする必要があります。
おそらく最も簡単な方法は (クレイジーに聞こえるかもしれませんが、見た目がコード臭いかもしれません)、次の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 列の最大値を使用してリセットされます。
ロールバック ケース -
私は自分のデータベースでテストしましたが、以前にここにリストされているこのコードを使用した場合にのみ機能します (+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(''?'')'
ロールバックの場合、私にとってはまったくうまくいきませんでした。トランザクションを開いてロールバックを実行すると、再シードはトランザクションで使用された最後の番号から開始されます。