CREATE TABLE (Transact-SQL) IDENTITY (Eigenschaft)CREATE TABLE (Transact-SQL) IDENTITY (Property)

GILT FÜR: jaSQL Server jaAzure SQL-DatenbankjaAzure SQL Data Warehouse neinParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure 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-Eigenschaft IDENTITY, die die IDENTITY-Eigenschaft für Zeilen 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-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

  
IDENTITY [ (seed , increment) ]  

ArgumenteArguments

seedseed
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.

incrementincrement
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).

BemerkungenRemarks

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 Seeds 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: Die Eindeutigkeit muss mit einer PRIMARY KEY- oder UNIQUE-Einschränkung bzw. einem UNIQUE-Index erzwungen werden.Uniqueness of the value - Uniqueness must be enforced by using a PRIMARY KEY or UNIQUE constraint or UNIQUE index.

  • Aufeinanderfolgende Werte innerhalb einer Transaktion: Bei einer Transaktion, durch die mehrere Zeilen eingefügt werden, ist nicht sichergestellt, dass Sie aufeinanderfolgende Werte für die Zeilen erhalten, da für die Tabelle möglicherweise andere gleichzeitige Einfügungsvorgänge stattfinden.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, sollte die Transaktion eine exklusive Sperre für die Tabelle oder die Isolationsstufe SERIALIZABLE verwenden.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 Fehlern -SQL ServerSQL Server kann Identitätswerte aus Leistungsgründen zwischenspeichern. Einige der zugewiesenen Werte können während eines Datenbankausfalls oder Serverneustarts verloren gehen.Consecutive values after server restart or other failures -SQL 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. Die Verwendung eines Sequenzgenerators mit der NOCACHE-Option kann die Lücken auf Transaktionen beschränken, für die nie ein Commit ausgeführt wird.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 werden die Identitätswerte von der Engine 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. Wenn Sie den Seed oder das Inkrement auf einen anderen Wert als 1 festlegen, kommt es zu folgendem Fehler: Die Verwendung von anderen Seeds und Inkrementwerten als 1 wird für speicheroptimierte 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;  

Weitere InformationenSee 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 (Funktion) (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