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

Si applica a:yes SQL Server (tutte le versioni supportate) Yesdatabase SQL di Azure YesIstanza gestita di SQL di Azure yesAzure Synapse Analytics

Crea una colonna Identity in una tabella. Questa proprietà viene usata con le istruzioni CREATE TABLE e ALTER TABLE Transact-SQL.

Nota

La proprietà IDENTITY è diversa dalla proprietà Identity di SQL-DMO, la quale espone la proprietà di identità di riga di una colonna.

Topic link iconConvenzioni di sintassi Transact-SQL

Sintassi

IDENTITY [ (seed , increment) ]

Nota

Questa sintassi non è supportata da pool SQL serverless in Azure Synapse Analytics.

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 e versioni precedenti, vedere Documentazione delle versioni precedenti.

Argomenti

seed
Valore usato per la prima riga caricata nella tabella.

increment
Valore incrementale aggiunto al valore Identity della riga caricata in precedenza.

Nota

In Azure Synapse Analytics i valori per l'identità non sono incrementali a causa dell'architettura distribuita del data warehouse. Per altre informazioni, vedere Uso di IDENTITY per creare chiavi sostitutive in un pool Synapse SQL.

È necessario specificare sia il valore di inizializzazione che l'incremento oppure nessuno dei due valori. In questo secondo caso, il valore predefinito è (1,1).

Osservazioni

Le colonne Identity possono essere usate per la generazione di valori di chiave. Tramite la proprietà Identity in una colonna viene garantito quanto riportato di seguito:

  • Ogni nuovo valore viene generato in base all'incremento di inizializzazione & corrente.

  • Ogni nuovo valore per una transazione specifica è diverso da altre transazioni simultanee nella tabella.

Tramite la proprietà Identity in una colonna non viene garantito quanto riportato di seguito:

  • Univocità del valore. L'univocità deve essere applicata con un vincolo PRIMARY KEY o UNIQUE o un indice UNIQUE.

Nota

Azure Synapse Analytics non supporta il vincolo PRIMARY KEY o UNIQUE né l'indice UNIQUE. Per altre informazioni, vedere Uso di IDENTITY per creare chiavi sostitutive in un pool Synapse SQL.

  • 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. Se i valori devono essere consecutivi, nella transazione deve essere usato un blocco esclusivo sulla tabella o il livello di isolamento SERIALIZABLE.

  • Valori consecutivi dopo il riavvio del server o altri errori: SQL Server potrebbe memorizzare nella cache i valori di identità per motivi di prestazioni e alcuni dei valori assegnati possono essere persi durante un errore di database o un riavvio del server. Questo può comportare dei gap nel valore Identity al momento dell'inserimento. Se i gap non sono accettabili, l'applicazione dovrà usare un meccanismo specifico per generare i valori chiave. L'uso di un generatore di sequenze con l'opzione NOCACHE può limitare i gap a transazioni di cui non è mai eseguito il commit.

  • Riuso di valori. Per una determinata proprietà Identity con valore di inizializzazione/incremento specifico, i valori Identity non vengono riusati dal motore. 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. Questa condizione può comportare dei gap quando vengono generati i successivi valori Identity.

Queste restrizioni fanno parte della progettazione per migliorare le prestazioni e perché sono accettabili in molte situazioni comuni. 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.

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. Per altre informazioni, vedere Replicare colonne Identity.

Ogni tabella può includere una sola colonna Identity.

Nelle tabelle ottimizzate per la memoria il valore di inizializzazione e l'incremento devono essere impostati su 1,1. Se si imposta il valore di inizializzazione o incremento su un valore diverso da 1 viene visualizzato l'errore seguente: L'uso di valori di inizializzazione e di incremento diversi da 1 non è supportato in tabelle con ottimizzazione per la memoria.

Esempi

R. Uso della proprietà IDENTITY con CREATE TABLE

Nell'esempio seguente viene creata una nuova tabella tramite la proprietà IDENTITY per un numero di identificazione a incremento automatico.

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. Uso della sintassi generica per individuare interruzioni nella sequenza di valori Identity

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.

Nota

La prima parte dello script Transact-SQL seguente è progettata solo per l'illustrazione. È possibile eseguire lo script Transact-SQL che inizia con il commento: -- 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 anche

ALTER TABLE (Transact-SQL)
CREATE TABLE (Transact-SQL)
DBCC CHECKIDENT (Transact-SQL)
IDENT_INCR (Transact-SQL)
@@IDENTITY (Transact-SQL)
IDENTITY (funzione) (Transact-SQL)
IDENT_SEED (Transact-SQL)
SELECT (Transact-SQL)
SET IDENTITY_INSERT (Transact-SQL)
Replicare colonne Identity