Freigeben über


IDENTITY-Eigenschaft (Transact-SQL)

Erstellt eine Identitätsspalte in einer Tabelle. Diese Eigenschaft wird in den Transact-SQL-Anweisungen CREATE TABLE und ALTER TABLE verwendet.

HinweisHinweis

Die IDENTITY-Eigenschaft unterscheidet sich von der SQL-DMO-Eigenschaft Identity, die die Identity-Eigenschaft für Zeilen einer Spalte verfügbar macht.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

IDENTITY [ (seed , increment ) ]

Argumente

  • seed
    Der Wert, der für die erste in die Tabelle geladene Zeile verwendet wird.

  • increment
    Der inkrementelle Wert, der zum Identitätswert der zuvor geladenen Zeile addiert wird.

Sie müssen entweder sowohl den Ausgangswert als auch den inkrementellen Wert oder keinen von beiden angeben. Wurden Ausgangswert und inkrementeller Wert nicht angegeben, ist der Standardwert (1,1).

Hinweise

Werden in einer Tabelle mit einer Identitätsspalte häufig Daten gelöscht, können Lücken zwischen einzelnen Identitätswerten auftreten. Falls dies ein Problem darstellt, sollten Sie die IDENTITY-Eigenschaft nicht verwenden. Um sicherzustellen, dass keine Lücken erstellt wurden, oder um eine bereits vorhandene Lücke zu füllen, sollten Sie die vorhandenen Identitätswerte prüfen, bevor Sie mit SET IDENTITY_INSERT ON explizit einen Wert eingeben.

Wenn Sie einen gelöschten Identitätswert erneut verwenden, suchen Sie mithilfe des Beispielcodes in Beispiel B den nächsten verfügbaren Identitätswert. Ersetzen Sie dabei tablename, column_type und MAX(column_type) - 1 durch den Namen einer Tabelle, den Datentyp der Identitätsspalte und den numerischen Wert des maximal zulässigen Werts (für diesen Datentyp) -1.

Mit DBCC CHECKIDENT können Sie den aktuellen Identitätswert überprüfen und mit dem Maximalwert in der Identitätsspalte vergleichen.

Wenn eine Tabelle mit einer Identitätsspalte für die Replikation veröffentlicht wird, muss die Identitätsspalte entsprechend des verwendeten Replikationstyps verwaltet werden. Weitere Informationen finden Sie unter Replizieren von Identitätsspalten.

Beispiele

A. Verwenden der IDENTITY-Eigenschaft mit CREATE TABLE

Im folgenden Beispiel wird eine neue Tabelle erstellt. Dabei wird die IDENTITY-Eigenschaft zum automatischen Erhöhen der Identifikationsnummer verwendet.

USE AdventureWorks2008R2
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. Verwenden der generischen Syntax zum Auffinden von Lücken in Identitätswerten

Im folgenden Beispiel wird die generische Syntax zum Auffinden von Lücken in Identitätswerten dargestellt. Diese Lücken entstehen, wenn Daten entfernt werden.

HinweisHinweis

Der erste Teil des folgenden Transact-SQL-Skripts dient lediglich zur Veranschaulichung. Sie können das Transact-SQL-Skript ausführen, das mit folgendem Kommentar beginnt: -- 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