Erstellen der Tabelle (Transact-SQL) IDENTITY (Eigenschaft)CREATE TABLE (Transact-SQL) IDENTITY (Property)

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)jaAzure SQL-DatenbankjaAzure SQL Data Warehouse neinParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse noParallel Data Warehouse

Erstellt eine Identitätsspalte in einer Tabelle.Creates an identity column in a table. Diese Eigenschaft wird in den Transact-SQLTransact-SQL-Anweisungen CREATE TABLE und ALTER TABLE verwendet.This property is used with the CREATE TABLE and ALTER TABLE Transact-SQLTransact-SQL statements.

Hinweis

Die IDENTITY-Eigenschaft unterscheidet sich von der SQL-DMO Identität Eigenschaft, die die Zeile Identity-Eigenschaft einer Spalte verfügbar macht.The IDENTITY property is different from the SQL-DMO Identity property that exposes the row identity property of a column.

Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax


IDENTITY [ (seed , increment) ]  

ArgumenteArguments

Startwertseed
Der Wert, der für die erste in die Tabelle geladene Zeile verwendet wird.Is the value that is used for the very first row loaded into the table.

Inkrementincrement
Der inkrementelle Wert, der zum Identitätswert der zuvor geladenen Zeile addiert wird.Is the incremental value that is added to the identity value of the previous row that was loaded.

Sie müssen entweder sowohl den Ausgangswert als auch den inkrementellen Wert oder keinen von beiden angeben.You must specify both the seed and increment or neither. Wurden Ausgangswert und inkrementeller Wert nicht angegeben, ist der Standardwert (1,1).If neither is specified, the default is (1,1).

HinweiseRemarks

Identitätsspalten können zum Generieren von Schlüsselwerten verwendet werden.Identity columns can be used for generating key values. Die Identitätseigenschaft für eine Spalte garantiert Folgendes:The identity property on a column guarantees the following:

  • Jeder neue Wert wird auf Grundlage des aktuellen Ausgangswerts und Inkrements generiert.Each new value is generated based on the current seed & increment.

  • Jeder neue Wert für eine bestimmte Transaktion unterscheidet sich von anderen gleichzeitigen Transaktionen für die Tabelle.Each new value for a particular transaction is different from other concurrent transactions on the table.

    Die Identitätseigenschaft für eine Spalte garantiert nicht Folgendes:The identity property on a column does not guarantee the following:

  • Eindeutigkeit des Werts – Eindeutigkeit muss erzwungen werden, mithilfe einer PRIMÄRSCHLÜSSEL oder UNIQUE Einschränkung oder UNIQUE Index.Uniqueness of the value – Uniqueness must be enforced by using a PRIMARY KEY or UNIQUE constraint or UNIQUE index.

  • Aufeinanderfolgende Werte innerhalb einer Transaktion – eine Transaktion Einfügen mehrerer Zeilen ist nicht unbedingt aufeinander folgender Werte für die Zeilen abgerufen werden, da andere gleichzeitigen einfügungen für die Tabelle auftreten können.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. Wenn Werte fortlaufend sein müssen, wird die Transaktion verwenden Sie eine exklusive Sperre für die Tabelle oder die SERIALIZABLE Isolationsstufe.If values must be consecutive then the transaction should use an exclusive lock on the table or use the SERIALIZABLE isolation level.

  • Aufeinanderfolgende Werte nach Serverneustart oder anderen FehlernSQL ServerSQL Server kann Identitätswerte aus Leistungsgründen Zwischenspeichern und einige der zugewiesenen Werte ist möglich während einer Datenbank Datenbankausfalls oder Serverneustarts verloren gehen.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. Dies kann zu Lücken im Identitätswert beim Einfügen führen.This can result in gaps in the identity value upon insert. Wenn Lücken nicht zulässig sind, sollte die Anwendung ihren eigenen Mechanismus verwenden, um Schlüsselwerte zu generieren.If gaps are not acceptable then the application should use its own mechanism to generate key values. Verwendung eines sequenzgenerators mit der NOCACHE Option kann einschränken, die Lücken auf Transaktionen, die nie ein Commit ausgeführt werden.Using a sequence generator with the NOCACHE option can limit the gaps to transactions that are never committed.

  • Wiederverwendung von Werten – für eine bestimmte Identitätseigenschaft mit spezifischem Ausgangswert/Inkrement, die Identität, die Werte werden vom Modul nicht wiederverwendet.Reuse of values – For a given identity property with specific seed/increment, the identity values are not reused by the engine. Wenn eine bestimmte INSERT-Anweisung fehlschlägt oder für die INSERT-Anweisung ein Rollback ausgeführt wird, gehen die verwendeten Identitätswerte verloren und werden nicht erneut generiert.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. Es können Lücken entstehen, wenn die nachfolgenden Identitätswerte generiert werden.This can result in gaps when the subsequent identity values are generated.

    Diese Einschränkungen sind beabsichtigt, um die Leistung zu verbessern. Ferner sind sie in vielen Situationen akzeptabel.These restrictions are part of the design in order to improve performance, and because they are acceptable in many common situations. Wenn Sie Identitätswerte aufgrund dieser Einschränkungen nicht verwenden können, sollten Sie eine separate Tabelle mit einem aktuellen Wert erstellen und den Zugriff auf die Tabelle und die Nummernzuweisung für die Anwendung verwalten.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.

    Wenn eine Tabelle mit einer Identitätsspalte für die Replikation veröffentlicht wird, muss die Identitätsspalte entsprechend dem verwendeten Replikationstyp verwaltet werden.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. Weitere Informationen finden Sie unter Replizieren von Identitätsspalten.For more information, see Replicate Identity Columns.

    Es kann nur eine Identitätsspalte pro Tabelle erstellt werden.Only one identity column can be created per table.

    In speicheroptimierten Tabellen müssen sowohl der Ausgangswert als auch das Inkrement auf 1,1 festgelegt werden.In memory-optimized tables the seed and increment must be set to 1,1. Festlegen der Ausgangswert oder Inkrement auf einen anderen Wert als 1 Ergebnisse in den folgenden Fehler: die Verwendung von Ausgangswerten und den inkrementellen Werte als 1 werden mit speicheroptimierten Tabellen nicht unterstützt.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.

BeispieleExamples

A.A. Verwenden der IDENTITY-Eigenschaft mit CREATE TABLEUsing the IDENTITY property with CREATE TABLE

Im folgenden Beispiel wird eine neue Tabelle erstellt. Dabei wird die IDENTITY-Eigenschaft zum automatischen Erhöhen der Identifikationsnummer verwendet.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. Verwenden generischer Syntax zum Auffinden von Lücken in IdentitätswertenUsing generic syntax for finding gaps in identity values

Im folgenden Beispiel wird generische Syntax zum Auffinden von Lücken in Identitätswerten dargestellt. Diese Lücken entstehen, wenn Daten entfernt werden.The following example shows generic syntax for finding gaps in identity values when data is removed.

Hinweis

Der erste Teil des folgenden Transact-SQLTransact-SQL-Skripts dient lediglich zur Veranschaulichung.The first part of the following Transact-SQLTransact-SQL script is designed for illustration only. Sie können das Transact-SQLTransact-SQL-Skript ausführen, das mit folgendem Kommentar beginnt: -- Create the img table.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;  

Siehe auchSee 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 ( Function ) ( 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)
Replizieren von IdentitätsspaltenReplicate Identity Columns