T-SQLを使用してSQLServerでテーブルを作成(または変更)する場合、IDENTITY()
を使用するオプションがあります。 ID列を作成するためのプロパティ。
ID列には、自動的に増加するID番号が含まれています。 IDENTITY()
プロパティはCREATE TABLE
で使用できます およびALTER TABLE
ステートメント。
構文
構文は次のようになります:
IDENTITY [ (seed , increment) ]
シード テーブルにロードされる最初の行に使用される値です。
増分 ロードされた前の行のID値に追加される増分値です。
両方の引数を指定するか、どちらも指定しない必要があります。どちらも指定しない場合、デフォルトは(1,1)
です。 。
例1-基本的な使用法
実例を示します。
CREATE TABLE Pets ( PetId int IDENTITY(1,1) PRIMARY KEY, PetName varchar(255) );
このコードは、2つの列を持つテーブルを作成します。最初の列(PetId
)は、IDENTITY()
を使用しているため、ID列です。 その定義のプロパティ。
ID列を作成したので、ペットの名前をPetName
に挿入できます。 各行のIDを含める必要のない列。
INSERT INTO Pets (PetName) VALUES ('Homer'), ('Felix'), ('Ruff'); SELECT * FROM Pet;
結果:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 1 | Homer | | 2 | Felix | | 3 | Ruff | +---------+-----------+
例2–異なるシードと増分
これは、異なるシードと増分を使用する例です。
この場合、シードは150から始まり、行ごとに10ずつ増加します。
CREATE TABLE Cities ( CityId int IDENTITY(150, 10) PRIMARY KEY, CityName varchar(255) );
次に、いくつかのデータを挿入して選択します:
INSERT INTO Cities (CityName) VALUES ('Auckland'), ('Danang'), ('Khon Kaen'); SELECT * FROM Cities;
結果:
+----------+------------+ | CityId | CityName | |----------+------------| | 150 | Auckland | | 160 | Danang | | 170 | Khon Kaen | +----------+------------+
例3–誤った使用法
前述のように、両方の引数を指定するか、どちらも指定しない必要があります。つまり、1つの引数だけを提供することはできません。引数を1つだけ指定するとどうなるかの例を次に示します。
CREATE TABLE Cities ( CityId int IDENTITY(1) PRIMARY KEY, CityName varchar(255) );
結果:
Msg 102, Level 15, State 1, Line 2 Incorrect syntax near ')'.
例4–ID値を上書きしようとしています
自動ID値を上書きしようとすると、次のようなエラーが発生する可能性があります。
INSERT INTO Cities (CityId, CityName) VALUES (123, 'Bangkok');
結果:
Msg 544, Level 16, State 1, Line 1 Cannot insert explicit value for identity column in table 'Cities' when IDENTITY_INSERT is set to OFF.
これは、IDENTITY()
によって作成された値を上書きしようとしているためです。 財産。多くの場合、それがID列であることを知らなかった可能性があります。このような場合、必要なのはINSERT
からID列を削除することだけです。 ステートメント。
ただし、本当に IDENTITY()
をオーバーライドする必要があります プロパティについては、SQLServerのIDENTITY列に値を挿入する方法を参照してください。
前述のように、ID値を上書きする必要がない場合は、その列をINSERT
から削除するだけです。 声明。
したがって、前のステートメントを次のように変更できます:
INSERT INTO Cities (CityName) VALUES ('Bangkok'); SELECT * FROM Cities;
結果:
+----------+------------+ | CityId | CityName | |----------+------------| | 150 | Auckland | | 160 | Danang | | 170 | Khon Kaen | | 180 | Bangkok | +----------+------------+
IDENTITY()プロパティの制限
列のIDプロパティは、次のことを保証します。
- 新しい値はそれぞれ、現在のシードと増分に基づいて生成されます。
- 特定のトランザクションの新しい値はそれぞれ、テーブル上の他の同時トランザクションとは異なります。
次のことを保証するものではありません:
- 値の一意性
- トランザクション内の連続する値
- サーバーの再起動またはその他の障害後の連続した値
- 値の再利用(たとえば、
INSERT
の場合 操作は失敗します)
これらの制限の詳細については、Microsoftのドキュメントを参照してください。