CREATE TABLE (Transact-SQL) IDENTITY (プロパティ)CREATE TABLE (Transact-SQL) IDENTITY (Property)

適用対象:○SQL Server (2008 以降)○Azure SQL Database○Azure SQL Data Warehouse XParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse noParallel Data Warehouse

テーブルに ID 列を作成します。Creates an identity column in a table. このプロパティは、 Transact-SQLTransact-SQL の CREATE TABLE ステートメントおよび ALTER TABLE ステートメントで使用します。This property is used with the CREATE TABLE and ALTER TABLE Transact-SQLTransact-SQL statements.

注意

IDENTITY プロパティは、列の行 ID プロパティを示す SQL-DMO Identity プロパティとは異なります。The IDENTITY property is different from the SQL-DMO Identity property that exposes the row identity property of a column.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax


IDENTITY [ (seed , increment) ]  

引数Arguments

seedseed
テーブルに読み込まれる最初の行に使用される値です。Is the value that is used for the very first row loaded into the table.

incrementincrement
既に読み込まれている前の行の ID 値に加算される増分の値です。Is the incremental value that is added to the identity value of the previous row that was loaded.

seed と increment の両方を指定するか、またはどちらも指定しないでください。You must specify both the seed and increment or neither. どちらも指定しないときの既定値は (1,1) です。If neither is specified, the default is (1,1).

RemarksRemarks

ID 列はキー値の生成に使用できます。Identity columns can be used for generating key values. 列の ID プロパティでは、次の点が保証されます。The identity property on a column guarantees the following:

  • 新しい値はそれぞれ、現在のシードと増分値に基づいて生成されます。Each new value is generated based on the current seed & increment.

  • 特定のトランザクションの新しい各値は、テーブルの他の同時実行トランザクションとは異なります。Each new value for a particular transaction is different from other concurrent transactions on the table.

    列の ID プロパティでは、次の点は保証されません。The identity property on a column does not guarantee the following:

  • 値の一意性: PRIMARY KEY 制約、UNIQUE 制約、または UNIQUE インデックスを使用して、一意性を強制する必要があります。Uniqueness of the value – Uniqueness must be enforced by using a PRIMARY KEY or UNIQUE constraint or UNIQUE index.

  • トランザクション内の連続する値: 複数行を挿入するトランザクションは、テーブルで同時に他の挿入が実行される可能性があるため、その複数行の連続する値を取得するとは限りません。Consecutive values within a transaction – A transaction inserting multiple rows is not guaranteed to get consecutive values for the rows because other concurrent inserts might occur on the table. 連続した値にする必要がある場合、トランザクションはテーブル上で排他ロックを使用するか、SERIALIZABLE 分離レベルを使用する必要があります。If values must be consecutive then the transaction should use an exclusive lock on the table or use the SERIALIZABLE isolation level.

  • サーバーの再起動または他のエラーが発生した後の連続した値: SQL ServerSQL Server では、パフォーマンス上の理由から ID 値をキャッシュすることがあります。割り当てられた値の一部は、データベースの障害やサーバーの再起動が発生したときに失われることがあります。Consecutive values after server restart or other failuresSQL ServerSQL Server might cache identity values for performance reasons and some of the assigned values can be lost during a database failure or server restart. その結果、挿入時に非連続的な ID 値が生成される場合があります。This can result in gaps in the identity value upon insert. 非連続的な値が許可されない場合、アプリケーションは独自のメカニズムを使用してキー値を生成する必要があります。If gaps are not acceptable then the application should use its own mechanism to generate key values. シーケンス ジェネレーターを NOCACHE オプションを指定して使用すると、非連続的な値を絶対にコミットされないトランザクションに制限することができます。Using a sequence generator with the NOCACHE option can limit the gaps to transactions that are never committed.

  • 値の再利用: 特定のシードと増分値が指定された特定の ID プロパティでは、ID 値がエンジンによって再利用されることはありません。Reuse of values – For a given identity property with specific seed/increment, the identity values are not reused by the engine. 特定の挿入ステートメントが失敗した場合または挿入ステートメントがロールバックされた場合、使用した ID 値は失われ、再度生成されることはありません。If a particular insert statement fails or if the insert statement is rolled back then the consumed identity values are lost and will not be generated again. その結果、それ以降の ID 値が生成されると、連続しない場合があります。This can result in gaps when the subsequent identity values are generated.

    これらの制限事項が仕様に含まれているのは、パフォーマンスを向上するため、および多くの一般的な状況で許容されるためです。These restrictions are part of the design in order to improve performance, and because they are acceptable in many common situations. これらの制限事項が原因で ID 値を使用できない場合は、アプリケーションを使用して、現在の値を保持する別のテーブルを作成し、テーブルと番号の割り当てへのアクセスを管理します。If you cannot use identity values because of these restrictions, create a separate table holding a current value and manage access to the table and number assignment with your application.

    ID 列を持つテーブルがレプリケーション用にパブリッシュされている場合、使用されているレプリケーションの種類に適した方法で、ID 列を管理する必要があります。If a table with an identity column is published for replication, the identity column must be managed in a way that is appropriate for the type of replication used. 詳細については、「Replicate Identity Columns」 (ID 列のレプリケート) を参照してください。For more information, see Replicate Identity Columns.

    ID 列は 1 つのテーブルにつき 1 つだけ作成できます。Only one identity column can be created per table.

    メモリ最適化テーブルで、シードと増分値を 1, 1 に設定する必要があります。In memory-optimized tables the seed and increment must be set to 1,1. シード値または増分を次のエラー結果が 1 以外の値に設定します。、シードと増分の値を使用するその他のよりも、1 は、メモリ最適化テーブルでサポートされていません。Setting the seed or increment to a value other than 1 results in the following error: The use of seed and increment values other than 1 is not supported with memory optimized tables.

使用例Examples

A.A. CREATE TABLE で IDENTITY プロパティを使用するUsing the IDENTITY property with CREATE TABLE

次の例では、ID 番号を自動的に増分するテーブルを、IDENTITY プロパティを使用して新規作成します。The following example creates a new table using the IDENTITY property for an automatically incrementing identification number.

USE AdventureWorks2012;  

IF OBJECT_ID ('dbo.new_employees', 'U') IS NOT NULL  
   DROP TABLE new_employees;  
GO  
CREATE TABLE new_employees  
(  
 id_num int IDENTITY(1,1),  
 fname varchar (20),  
 minit char(1),  
 lname varchar(30)  
);  

INSERT new_employees  
   (fname, minit, lname)  
VALUES  
   ('Karin', 'F', 'Josephs');  

INSERT new_employees  
   (fname, minit, lname)  
VALUES  
   ('Pirkko', 'O', 'Koskitalo');  

B.B. ID 値のギャップを検索する汎用構文を使用するUsing generic syntax for finding gaps in identity values

次の例では、データが削除された場合に ID 値のギャップを検索する汎用構文を示します。The following example shows generic syntax for finding gaps in identity values when data is removed.

注意

次に示す Transact-SQLTransact-SQL スクリプトの最初の部分は、あくまでも参考です。The first part of the following Transact-SQLTransact-SQL script is designed for illustration only. 実行できるのは、"-- Create the img table" というコメントで始まる Transact-SQLTransact-SQL スクリプトです。You can run the Transact-SQLTransact-SQL script that starts with the comment: -- Create the img table.

-- Here is the generic syntax for finding identity value gaps in data.  
-- The illustrative example starts here.  
SET IDENTITY_INSERT tablename ON;  
DECLARE @minidentval column_type;  
DECLARE @maxidentval column_type;  
DECLARE @nextidentval column_type;  
SELECT @minidentval = MIN($IDENTITY), @maxidentval = MAX($IDENTITY)  
    FROM tablename  
IF @minidentval = IDENT_SEED('tablename')  
   SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('tablename')  
   FROM tablename t1  
   WHERE $IDENTITY BETWEEN IDENT_SEED('tablename') AND   
      @maxidentval AND  
      NOT EXISTS (SELECT * FROM tablename t2  
         WHERE t2.$IDENTITY = t1.$IDENTITY +   
            IDENT_INCR('tablename'))  
ELSE  
   SELECT @nextidentval = IDENT_SEED('tablename');  
SET IDENTITY_INSERT tablename OFF;  
-- Here is an example to find gaps in the actual data.  
-- The table is called img and has two columns: the first column   
-- called id_num, which is an increasing identification number, and the   
-- second column called company_name.  
-- This is the end of the illustration example.  

-- Create the img table.  
-- If the img table already exists, drop it.  
-- Create the img table.  
IF OBJECT_ID ('dbo.img', 'U') IS NOT NULL  
   DROP TABLE img;  
GO  
CREATE TABLE img (id_num int IDENTITY(1,1), company_name sysname);  
INSERT img(company_name) VALUES ('New Moon Books');  
INSERT img(company_name) VALUES ('Lucerne Publishing');  
-- SET IDENTITY_INSERT ON and use in img table.  
SET IDENTITY_INSERT img ON;  

DECLARE @minidentval smallint;  
DECLARE @nextidentval smallint;  
SELECT @minidentval = MIN($IDENTITY) FROM img  
 IF @minidentval = IDENT_SEED('img')  
    SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('img')  
    FROM img t1  
    WHERE $IDENTITY BETWEEN IDENT_SEED('img') AND 32766 AND  
      NOT    EXISTS (SELECT * FROM img t2  
          WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('img'))  
 ELSE  
    SELECT @nextidentval = IDENT_SEED('img');  
SET IDENTITY_INSERT img OFF;  

参照See Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
DBCC CHECKIDENT (Transact-SQL) DBCC CHECKIDENT (Transact-SQL)
IDENT_INCR (Transact-SQL) IDENT_INCR (Transact-SQL)
@@IDENTITY (Transact-SQL) @@IDENTITY (Transact-SQL)
IDENTITY (関数) (Transact-SQL) IDENTITY (Function) (Transact-SQL)
IDENT_SEED (Transact-SQL) IDENT_SEED (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
SET IDENTITY_INSERT (Transact-SQL) SET IDENTITY_INSERT (Transact-SQL)
ID 列のレプリケートReplicate Identity Columns