SQL Server 2005 で IDENTITY列 を含むテーブルを転送する

概要: 結論としては何もしなくてよい。

SQL Server 2000 時代は、IDENTITY列の挿入を有効にしてテーブルを転送した場合に、転送先のテーブルで利用される次の値(Seed)が再設定されないためにトラブルになることがあった。

そのため SQL:テーブルのIdentitySeedを動的に設定したい を参照して次のようなSQL文を書いていた。

DECLARE @NewIdentitySeed int
SET @NewIdentitySeed = (SELECT MAX(id)+1 FROM testtable)
DBCC CHECKIDENT('dbo.testtable', RESEED, @NewIdentitySeed)

…だが、SET IDENTITY_INSERT dbo.testtable ON の状態で列を追加し、DBCC CHECKIDENT (‘dbo.testtable’, NORESEED) でSeedを確認したところ、すでに更新されている状態になっていた。

すなわち SET IDENTITY_INSERT dbo.testtable ON の状態の場合

  • IDENTITY列に対して、現在のSeedより大きい値が入ってきた場合は、Seedを更新する
  • IDENTITY列に対して、現在のSeedと同じか小さい値が入ってきた場合は、Seedは更新されない

という挙動をする。

(追記)この挙動がいつ追加されたかについてのポインタは見つけていない。実験したのは SQL Server 9.0.3186 にて

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。