CREATE TABLE (Transact-SQL) IDENTITY (proprietà)CREATE TABLE (Transact-SQL) IDENTITY (Property)

SI APPLICA A: sìSQL Server sìDatabase SQL di Azure sìAzure SQL Data Warehouse noParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse noParallel Data Warehouse

Crea una colonna Identity in una tabella.Creates an identity column in a table. Questa proprietà viene utilizzata con le istruzioni CREATE TABLE e ALTER TABLE di Transact-SQLTransact-SQL.This property is used with the CREATE TABLE and ALTER TABLE Transact-SQLTransact-SQL statements.

Nota

La proprietà IDENTITY è diversa dalla proprietà Identity di SQL-DMO, la quale espone la proprietà di identità di riga di una colonna.The IDENTITY property is different from the SQL-DMO Identity property that exposes the row identity property of a column.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

  
IDENTITY [ (seed , increment) ]  

ArgomentiArguments

seedseed
Valore usato per la prima riga caricata nella tabella.Is the value that is used for the very first row loaded into the table.

incrementincrement
Valore incrementale aggiunto al valore Identity della riga caricata in precedenza.Is the incremental value that is added to the identity value of the previous row that was loaded.

È necessario specificare sia il valore di inizializzazione che l'incremento oppure nessuno dei due valori.You must specify both the seed and increment or neither. In questo secondo caso, il valore predefinito è (1,1).If neither is specified, the default is (1,1).

RemarksRemarks

Le colonne Identity possono essere usate per la generazione di valori di chiave.Identity columns can be used for generating key values. Tramite la proprietà Identity in una colonna viene garantito quanto riportato di seguito:The identity property on a column guarantees the following:

  • Ogni nuovo valore viene generato in base all'incremento e al valore di inizializzazione correnti.Each new value is generated based on the current seed & increment.

  • Ogni nuovo valore per una transazione specifica è diverso da altre transazioni simultanee nella tabella.Each new value for a particular transaction is different from other concurrent transactions on the table.

Tramite la proprietà Identity in una colonna non viene garantito quanto riportato di seguito:The identity property on a column does not guarantee the following:

  • Univocità del valore. L'univocità deve essere applicata con un vincolo PRIMARY KEY o UNIQUE o un indice UNIQUE.Uniqueness of the value - Uniqueness must be enforced by using a PRIMARY KEY or UNIQUE constraint or UNIQUE index.

  • Valori consecutivi in una transazione. In una transazione con cui vengono inserite più righe non viene garantito il recupero di valori consecutivi per le righe, perché si possono verificare altri inserimenti simultanei nella tabella.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. Se i valori devono essere consecutivi, nella transazione deve essere usato un blocco esclusivo sulla tabella o il livello di isolamento SERIALIZABLE.If values must be consecutive then the transaction should use an exclusive lock on the table or use the SERIALIZABLE isolation level.

  • Valori consecutivi dopo il riavvio del server o altri errori -SQL ServerSQL Server potrebbe memorizzare nella cache valori Identity per motivi di prestazioni e alcuni valori assegnati possono andare persi durante un errore del database o un riavvio del server.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. Questo può comportare dei gap nel valore Identity al momento dell'inserimento.This can result in gaps in the identity value upon insert. Se i gap non sono accettabili, l'applicazione dovrà usare un meccanismo specifico per generare i valori chiave.If gaps are not acceptable then the application should use its own mechanism to generate key values. L'uso di un generatore di sequenze con l'opzione NOCACHE può limitare i gap a transazioni di cui non è mai eseguito il commit.Using a sequence generator with the NOCACHE option can limit the gaps to transactions that are never committed.

  • Riuso di valori. Per una determinata proprietà Identity con valore di inizializzazione/incremento specifico, i valori Identity non vengono riusati dal motore.Reuse of values - For a given identity property with specific seed/increment, the identity values are not reused by the engine. Se una particolare istruzione INSERT non riesce o se viene eseguito il rollback di quest'ultima, i valori Identity usati vengono persi e non saranno generati di nuovo.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. Questa condizione può comportare dei gap quando vengono generati i successivi valori Identity.This can result in gaps when the subsequent identity values are generated.

Queste restrizioni fanno parte della progettazione per migliorare le prestazioni e perché sono accettabili in molte situazioni comuni.These restrictions are part of the design in order to improve performance, and because they are acceptable in many common situations. Se non è possibile usare valori Identity a causa di queste restrizioni, creare una tabella separata contenente un valore corrente e gestire l'accesso all'assegnazione di numeri e tabelle con l'applicazione.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.

Se una tabella che include una colonna Identity viene pubblicata per la replica, la colonna Identity deve essere gestita in modo adeguato per il tipo di replica usato.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. Per altre informazioni, vedere Replicare colonne Identity.For more information, see Replicate Identity Columns.

Ogni tabella può includere una sola colonna Identity.Only one identity column can be created per table.

Nelle tabelle ottimizzate per la memoria il valore di inizializzazione e l'incremento devono essere impostati su 1,1.In memory-optimized tables the seed and increment must be set to 1,1. Se il valore di inizializzazione o l'incremento vengono impostati su un valore diverso da 1, viene restituito l'errore seguente: L'uso di valori diversi da 1 per il valore di inizializzazione e l'incremento non è supportato con le tabelle con ottimizzazione per la memoria.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.

EsempiExamples

A.A. Uso della proprietà IDENTITY con CREATE TABLEUsing the IDENTITY property with CREATE TABLE

Nell'esempio seguente viene creata una nuova tabella tramite la proprietà IDENTITY per un numero di identificazione a incremento automatico.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. Uso della sintassi generica per individuare interruzioni nella sequenza di valori IdentityUsing generic syntax for finding gaps in identity values

Nell'esempio seguente viene illustrato l'uso di una sintassi generica per individuare le interruzioni nella sequenza di valori Identity create in seguito alla rimozione di dati.The following example shows generic syntax for finding gaps in identity values when data is removed.

Nota

La prima parte del seguente script Transact-SQLTransact-SQL è riportata solo a scopo illustrativo.The first part of the following Transact-SQLTransact-SQL script is designed for illustration only. È possibile eseguire lo script Transact-SQLTransact-SQL a partire dal commento -- 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;  

Vedere ancheSee 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)
Replicare colonne IdentityReplicate Identity Columns