この記事では、SQLServerIDENTITYプロパティとIDENTITY列の機能の基本と詳細について説明します。また、IDENTITY_INSERT機能を使用してID列に明示的な値を挿入する方法についても検討します。
SQLServerのIDENTITYプロパティとIDENTITY列の概要
SQL Serverでは、identityプロパティを使用すると、identityプロパティ構文の設定に従ってSQLServerテーブルにID列を作成できます。 Identityプロパティの構文は次のようになり、この構文を適用してテーブルステートメントを作成または変更します。
IDENTITY [(シード、増分)]
最初に、identityプロパティのパラメータを調べます。このプロパティは2つの入力パラメータを取ります。最初のパラメータはシードで、2番目のパラメータは増分です。 seedパラメーターは、テーブルに挿入された値の最初の開始値を指定し、Incrementパラメーターは、挿入されたデータの増分値を定義します。
ここで、いくつかの例を使用して、IDプロパティのこの主要な定義を強化します。
SQLServerでID列を作成する方法
例-1 :次の例では、ID列を作成し、最初の値は1から始まり、1ずつ増加します。
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES ('The first inserted row') INSERT INTO TestIdentity VALUES ('The second inserted row') INSERT INTO TestIdentity VALUES ('The third inserted row') INSERT INTO TestIdentity VALUES ('The fourth inserted row') SELECT Id as [IdentityColumn],Col1 FROM TestIdentity
例-2 :次の例では、ID列を作成し、最初の値は37から始まり、20ずつ20ずつ増加します。
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(37,20) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES ('The first inserted row') INSERT INTO TestIdentity VALUES ('The second inserted row') INSERT INTO TestIdentity VALUES ('The third inserted row') INSERT INTO TestIdentity VALUES ('The fourth inserted row') SELECT Id as [IdentityColumn],Col1 FROM TestIdentity
上記の例でわかるように、identityプロパティは、シードとIDのパラメーターに従って自動インクリメント値を生成します。
SQL Server ID列に明示的な値を挿入するにはどうすればよいですか?
デフォルトでは、identityプロパティでは、ID列に明示的な値を挿入することはできません。 ID列に明示的な値を挿入しようとすると、次のエラーが発生します。
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES (1,'The first inserted row')
メッセージ8101、レベル16、状態1、行9
のID列の明示的な値 table 、「TestIdentity」は、列リストが使用され、IDENTITY_INSERTがONの場合にのみ指定できます。
テーブルのIDENTITY_INSERT機能を有効にすることで、このエラーを解決できます。ここで、挿入ステートメントを次のように変更します。
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row') SET IDENTITY_INSERT TestIdentity OFF SELECT * FROM TestIdentity
この問題に関するもう1つの重要な点は、ステートメントを挿入するための列リストを作成する必要があることです。これを行わないと、次のエラーが発生します。
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity VALUES (1,'The first inserted row') SET IDENTITY_INSERT TestIdentity OFF>
メッセージ8101、レベル16、状態1、行9
のID列の明示的な値 table 、「TestIdentity」は、列リストが使用され、IDENTITY_INSERTがONの場合にのみ指定できます。
このエラーは、挿入ステートメントに列リストがないことを定義します。以下の挿入ステートメントで、このエラーを修正します。
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) ---column list VALUES (90,'The first inserted row') SET IDENTITY_INSERT TestIdentity OFF
場合によっては、別のテーブルから1つのテーブルにデータを挿入する必要があります。この操作を実行する最良の方法の1つは、「INSERTINTOSELECT」ステートメントを使用することです。ただし、ターゲットテーブルにID列がある場合は、ターゲットテーブルでIDENTITY_INSERTオプションを有効にする必要があります。また、ターゲットテーブルの列リストを作成する必要があります。
DROP TABLE IF EXISTS TestIdentity DROP TABLE IF EXISTS SourceTable CREATE TABLE SourceTable (ID INT, Val1 VARCHAR(100)) INSERT INTO SourceTable VALUES (1,'First Row'),(2,'Second Row') GO CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) SELECT * FROM SourceTable SET IDENTITY_INSERT TestIdentity OFF
IDENTITY_INSERTオプションの欠点は、ID列の値の間にギャップが生じる可能性があることです。次のようなステートメントは、ID列の値の間にギャップを生成します。
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) INSERT INTO TestIdentity ---column list VALUES ('The first inserted row (INDENTITY_INSERT_OFF)') SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) ---column list VALUES (90,'The second inserted row (INDENTITY_INSERT_ON') SET IDENTITY_INSERT TestIdentity OFF INSERT INTO TestIdentity ---column list VALUES ('The third inserted row (INDENTITY_INSERT_OFF)') SELECT * FROM TestIdentity
DBCCCHECKIDENTコマンド
DBCC CHECKIDENTコマンドを使用すると、ID列の最後の値に関する詳細を取得できます。この関数を使用すると、ID列の現在の値をリセットして別の値に変更することもできます。ここで、DBCCCHECKIDENTコマンドを使用してIDの最後の値を取得します。
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES ('The first inserted row') INSERT INTO TestIdentity VALUES ('The second inserted row') INSERT INTO TestIdentity VALUES ('The third inserted row') INSERT INTO TestIdentity VALUES ('The fourth inserted row') DBCC CHECKIDENT ('TestIdentity', NORESEED)
DBCC CHECKIDENTコマンドに関する別のオプションは、ID列を必要な値にリセットすることです。次の例では、RESEEDパラメーターがID列の最大値を100に変更し、その後に挿入される値はこの最大値を使用します。
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES ('The first inserted row') INSERT INTO TestIdentity VALUES ('The second inserted row') INSERT INTO TestIdentity VALUES ('The third inserted row') INSERT INTO TestIdentity VALUES ('The fourth inserted row') GO DBCC CHECKIDENT ('TestIdentity',RESEED,100) GO INSERT INTO TestIdentity VALUES ('The fifth inserted row') SELECT * FROM TestIdentity
SQLServerのID列と一意性
ID列は、一意の値の生成を保証するものではありません。これはID列に関する一般的な紛らわしい問題であるため、生成された値の一意性を確保したい場合は、これらの列に一意のインデックスを使用できます。次に、ID列に重複する値を作成する方法を証明およびデモンストレーションします。
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)') INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)') SET IDENTITY_INSERT TestIdentity OFF SELECT * FROM TestIdentity
さらに、ID列と主キーはSQLServerの2つの異なるオブジェクトです。 ID列の使用目的は、自動インクリメントされた番号を生成することです。一方、主キー制約は、特定の列の値の一意性を保証および提供します。デフォルトでは、主キーはテーブルにクラスター化された一意のインデックスを作成するため、主キー制約は定義された列に一意の値を適用します。一般的な使用法では、主キー制約とIDプロパティを一緒に使用できます。この使用方法は、主キーの一意性とIDの自動インクリメント機能の柔軟性を適用された列にもたらすのに役立ちます。次の例では、Id列に主キー制約を追加し、挿入された値の重複を防ぎます。
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) PRIMARY KEY, Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)') INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)') SET IDENTITY_INSERT TestIdentity OFF SELECT * FROM TestIdentity
オブジェクトエクスプローラーでTestIdentityテーブルの[インデックス]タブをナビゲートすると、主キー制約によって作成された一意のクラスター化インデックスを見つけることができます。この制約は、Id列の一意の値に適用されます。
結論
この記事では、SQLServerIdentityプロパティとIdentity列の基本的な概念と使用方法について説明しました。
参照
- CREATE TABLE(Transact-SQL)IDENTITY(プロパティ)
- 主キーを作成する