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

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

ms186775.note(ja-jp,SQL.90).gifメモ :
IDENTITY プロパティは、列の行 ID プロパティを示す SQL-DMO IDENTITY プロパティとは異なります。

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

構文

IDENTITY [ (seed , increment) ]

引数

seed

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

increment

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

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

解説

ID 列を持ったテーブルに対して頻繁に削除を行うと、ID 値間でギャップが生じる可能性があります。これが問題ならば、IDENTITY プロパティは使用しないでください。ギャップが生じないようにするには、また、既にあるギャップを埋めるには、IDENTITY_INSERT を ON に設定して明示的に値を入力する前に、既存の ID 値を評価してください。

削除した ID 値を再び使用する場合は、例 B のサンプル コードを使用して、次に使用可能な ID 値を検索します。tablenamecolumn_typeMAX(column_type) - 1 をそれぞれ、テーブル名、ID 列のデータ型、そのデータ型の数値の最高許容値 -1 と置き換えてください。

DBCC CHECKIDENT を使用して現在の ID 値を調べ、その値を ID 列の最大値と比較します。

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

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

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

USE AdventureWorks
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 値のギャップを検索する汎用構文を示します。

ms186775.note(ja-jp,SQL.90).gifメモ :
次に示す 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 (Transact-SQL)
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 列のレプリケート

ヘルプおよび情報

SQL Server 2005 の参考資料の入手