次の方法で共有


IDENTITY (プロパティ) (Transact-SQL)

テーブルに ID 列を作成します。 このプロパティは、Transact-SQL の CREATE TABLE ステートメントおよび ALTER TABLE ステートメントで使用します。

注意

IDENTITY プロパティは、列の行 ID プロパティを示す SQL-DMO IDENTITY プロパティとは異なります。

適用対象: SQL Server (SQL Server 2008 から現在のバージョンまで)

トピック リンク アイコン Transact-SQL 構文表記規則

構文

IDENTITY [ (seed , increment) ]

引数

  • seed
    テーブルに読み込まれる最初の行に使用される値です。

  • increment
    既に読み込まれている前の行の ID 値に加算される増分の値です。

seed と increment の両方を指定するか、またはどちらも指定しないでください。 どちらも指定しないときの既定値は (1,1) です。

説明

ID 列はキー値の生成に使用できます。 列の ID プロパティでは、次の点が保証されます。

  • 新しい値はそれぞれ、現在のシードと増分値に基づいて生成されます。

  • 特定のトランザクションの新しい各値は、テーブルの他の同時実行トランザクションとは異なります。

列の ID プロパティでは、次の点は保証されません。

  • 値の一意性: PRIMARY KEY 制約、UNIQUE 制約、または UNIQUE インデックスを使用して、一意性を強制する必要があります。

  • トランザクション内の連続する値: 複数行を挿入するトランザクションは、テーブルで同時に他の挿入が実行される可能性があるため、その複数行の連続する値を取得するとは限りません。 連続した値にする必要がある場合、トランザクションはテーブル上で排他ロックを使用するか、SERIALIZABLE 分離レベルを使用する必要があります。

  • サーバーの再起動または他のエラーが発生した後の連続した値: SQL Server では、パフォーマンス上の理由から ID 値をキャッシュすることがあります。割り当てられた値の一部は、データベースの障害やサーバーの再起動が発生したときに失われることがあります。 その結果、挿入時に非連続的な ID 値が生成される場合があります。 非連続的な値が許可されない場合、アプリケーションでは、シーケンス ジェネレーターを NOCACHE オプションを指定して使用するか独自のメカニズムを使用して、キー値を生成する必要があります。

  • 値の再利用: 特定のシードと増分値が指定された特定の ID プロパティでは、ID 値がエンジンによって再利用されることはありません。 特定の挿入ステートメントが失敗した場合または挿入ステートメントがロールバックされた場合、使用した ID 値は失われ、再度生成されることはありません。 その結果、それ以降の ID 値が生成されると、連続しない場合があります。

これらの制限事項が仕様に含まれているのは、パフォーマンスを向上するため、および多くの一般的な状況で許容されるためです。 これらの制限事項が原因で ID 値を使用できない場合は、アプリケーションを使用して、現在の値を保持する別のテーブルを作成し、テーブルと番号の割り当てへのアクセスを管理します。

ID 列を持つテーブルがレプリケーション用にパブリッシュされている場合、使用されているレプリケーションの種類に適した方法で、ID 列を管理する必要があります。 詳細については、「ID 列のレプリケート」を参照してください。

ID 列は 1 つのテーブルにつき 1 つだけ作成できます。

使用例

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

次の例では、ID 番号を自動的に増分するテーブルを、IDENTITY プロパティを使用して新規作成します。

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. ID 値のギャップを検索する汎用構文を使用する

次の例では、データが削除された場合に ID 値のギャップを検索する汎用構文を示します。

注意

次に示す Transact-SQL スクリプトの最初の部分は、あくまでも参考です。実行できるのは、"-- Create the img table" というコメント以降の Transact-SQL スクリプトです。

-- 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;

関連項目

参照

ALTER TABLE (Transact-SQL)

CREATE TABLE (SQL Server)

DBCC CHECKIDENT (Transact-SQL)

IDENT_INCR (Transact-SQL)

@@IDENTITY (Transact-SQL)

IDENTITY (関数) (Transact-SQL)

IDENT_SEED (Transact-SQL)

SELECT (Transact-SQL)

SET IDENTITY_INSERT (Transact-SQL)

概念

ID 列のレプリケート