Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come utilizzare la proprietà IDENTITY() in SQL Server

Quando usi T-SQL per creare (o modificare) una tabella in SQL Server, hai la possibilità di usare IDENTITY() proprietà per creare una colonna di identità.

Una colonna di identità contiene un numero di identificazione a incremento automatico. Il IDENTITY() la proprietà può essere utilizzata con CREATE TABLE e ALTER TABLE dichiarazioni.

Sintassi

La sintassi è questa:

IDENTITY [ (seed , increment) ]

Il seme è il valore utilizzato per la prima riga caricata nella tabella.

L'incremento è il valore incrementale che viene aggiunto al valore di identità della riga precedente che è stata caricata.

Devi specificare entrambi gli argomenti o nessuno dei due. Se non specifichi nessuno dei due, il valore predefinito è (1,1) .

Esempio 1 – Utilizzo di base

Ecco un esempio da dimostrare.

CREATE TABLE Pets (
    PetId int IDENTITY(1,1) PRIMARY KEY, 
    PetName varchar(255)
    );

Questo codice crea una tabella con due colonne. La prima colonna (PetId ) è una colonna di identità perché utilizzo IDENTITY() proprietà nella sua definizione.

Ora che ho creato una colonna di identità, posso inserire nomi di animali domestici nel PetName colonna senza dover includere un ID per ogni riga.

INSERT INTO Pets (PetName)
VALUES ('Homer'), ('Felix'), ('Ruff');

SELECT * FROM Pet;

Risultato:

+---------+-----------+
| PetId   | PetName   |
|---------+-----------|
| 1       | Homer     |
| 2       | Felix     |
| 3       | Ruff      |
+---------+-----------+

Esempio 2:seme diverso e incremento

Ecco un esempio che utilizza un seme e un incremento diversi.

In questo caso il seme parte da 150 e aumenta di 10 per ogni riga.

CREATE TABLE Cities (
    CityId int IDENTITY(150, 10) PRIMARY KEY, 
    CityName varchar(255)
    );

Ora inserisci dei dati e selezionali:

INSERT INTO Cities (CityName)
VALUES ('Auckland'), ('Danang'), ('Khon Kaen');

SELECT * FROM Cities;

Risultato:

+----------+------------+
| CityId   | CityName   |
|----------+------------|
| 150      | Auckland   |
| 160      | Danang     |
| 170      | Khon Kaen  |
+----------+------------+

Esempio 3 – Utilizzo scorretto

Come accennato, è necessario specificare entrambi gli argomenti o nessuno dei due. In altre parole, non puoi fornire un solo argomento. Ecco un esempio di cosa succede quando fornisci un solo argomento.

CREATE TABLE Cities (
    CityId int IDENTITY(1) PRIMARY KEY, 
    CityName varchar(255)
    );

Risultato:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near ')'.

Esempio 4:tentativo di sovrascrivere i valori di identità

Se provi a sovrascrivere i valori di identità automatici, potresti ricevere un errore come questo.

INSERT INTO Cities (CityId, CityName)
VALUES (123, 'Bangkok');

Risultato:

Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for identity column in table 'Cities' when IDENTITY_INSERT is set to OFF.

Questo perché stai cercando di sovrascrivere i valori creati da IDENTITY() proprietà. In molti casi potrebbe essere che non sapevi che era una colonna di identità. In questi casi, tutto ciò che devi fare è rimuovere la colonna dell'identità dal tuo INSERT dichiarazione.

Tuttavia, se davvero lo fai necessario sovrascrivere IDENTITY() proprietà, vedere Come inserire valori in una colonna IDENTITY in SQL Server.

Come accennato, se non hai bisogno di sovrascrivere i valori di identità, puoi semplicemente rimuovere quella colonna dal tuo INSERT dichiarazione.

Quindi posso modificare la precedente affermazione in questo:

INSERT INTO Cities (CityName)
VALUES ('Bangkok');

SELECT * FROM Cities;

Risultato:

+----------+------------+
| CityId   | CityName   |
|----------+------------|
| 150      | Auckland   |
| 160      | Danang     |
| 170      | Khon Kaen  |
| 180      | Bangkok    |
+----------+------------+

Limitazioni della proprietà IDENTITY()

La proprietà identity su una colonna garantisce quanto segue:

  • Ogni nuovo valore viene generato in base al seed e all'incremento correnti.
  • Ogni nuovo valore per una determinata transazione è diverso dalle altre transazioni simultanee sul tavolo.

Non garantisce quanto segue:

  • Unicità del valore
  • Valori consecutivi all'interno di una transazione
  • Valori consecutivi dopo il riavvio del server o altri errori
  • Riutilizzo dei valori (ad esempio, quando un INSERT operazione fallita)

Per ulteriori informazioni su queste limitazioni, vedere la documentazione Microsoft.