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

Introduzione all'identità di SQL Server

In questo articolo esploreremo le nozioni di base e i dettagli della proprietà IDENTITY di SQL Server e delle funzionalità della colonna IDENTITY. Inoltre, considereremo come inserire valori espliciti nelle colonne identità tramite la funzione IDENTITY_INSERT.

Introduzione alla proprietà IDENTITY e alla colonna IDENTITY di SQL Server

In SQL Server, la proprietà identity consente di creare colonne di identità nelle tabelle di SQL Server in base alle impostazioni della sintassi della proprietà di identità. La sintassi della proprietà identity è la seguente e applichiamo questa sintassi per creare o modificare un'istruzione tabella.

IDENTITÀ [(seme, incremento)]

Per prima cosa esamineremo i parametri della proprietà identity. Questa proprietà accetta due parametri di input:il primo è seed e il secondo è incremento. Il parametro seed specifica che il primo valore iniziale del valore inserito nella tabella e il parametro Increment definisce il valore di incremento dei dati inseriti.

Ora intensificheremo questa definizione principale di proprietà di identità con alcuni esempi.

Come creare la colonna Identity in SQL Server

Esempio-1 :Nell'esempio seguente creeremo una colonna identità e il primo valore inizierà da 1 e incrementerà 1 di 1.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

GO

INSERT INTO TestIdentity
VALUES ('The first inserted row')

INSERT INTO TestIdentity
VALUES ('The second inserted row')

INSERT INTO TestIdentity
VALUES ('The third inserted row')

INSERT INTO TestIdentity
VALUES ('The fourth inserted row')

SELECT Id as [IdentityColumn],Col1 FROM TestIdentity

Esempio-2 :Nell'esempio seguente creeremo una colonna identità e il primo valore inizierà da 37 e incrementerà 20 di 20.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(37,20) ,
Col1 VARCHAR(100))

GO

INSERT INTO TestIdentity
VALUES ('The first inserted row')

INSERT INTO TestIdentity
VALUES ('The second inserted row')

INSERT INTO TestIdentity
VALUES ('The third inserted row')

INSERT INTO TestIdentity
VALUES ('The fourth inserted row')

SELECT Id as [IdentityColumn],Col1 FROM TestIdentity

Come puoi vedere nell'esempio precedente, la proprietà identity fornisce la generazione dei valori di incremento automatico in base ai parametri seed e identity.

Come inserire valori espliciti nella colonna Identity di SQL Server?

Per impostazione predefinita, la proprietà identity non ci consente di inserire valori espliciti nelle colonne identity. Se provi a inserire valori espliciti in una colonna di identità, riscontrerai il seguente errore.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

GO

INSERT INTO TestIdentity
VALUES (1,'The first inserted row')

Msg 8101, livello 16, stato 1, riga 9
Un valore esplicito per la colonna Identity in table, 'TestIdentity' può essere specificato solo quando viene utilizzato un elenco di colonne e IDENTITY_INSERT è ON.

Possiamo superare questo errore abilitando la funzione IDENTITY_INSERT della tabella. Ora cambieremo l'istruzione di inserimento come segue.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

SET IDENTITY_INSERT TestIdentity ON

INSERT INTO TestIdentity (Id,Col1)  
VALUES (1,'The first inserted row')

SET IDENTITY_INSERT TestIdentity OFF

SELECT * FROM TestIdentity

Un altro punto chiave su questo problema è che dobbiamo scrivere un elenco di colonne per inserire l'istruzione. In caso contrario, riscontreremo il seguente errore.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

SET IDENTITY_INSERT TestIdentity ON

INSERT INTO TestIdentity   
VALUES (1,'The first inserted row')

SET IDENTITY_INSERT TestIdentity OFF

Msg 8101, livello 16, stato 1, riga 9
Un valore esplicito per la colonna Identity in table, 'TestIdentity' può essere specificato solo quando viene utilizzato un elenco di colonne e IDENTITY_INSERT è ON.

Questo errore definisce che l'elenco di colonne è mancante nell'istruzione di inserimento. Nella seguente dichiarazione di inserimento, correggeremo questo errore.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

SET IDENTITY_INSERT TestIdentity ON

INSERT INTO TestIdentity  (Id,Col1) ---column list
VALUES (90,'The first inserted row')

SET IDENTITY_INSERT TestIdentity OFF

In alcuni casi, è necessario inserire dati in una tabella da un'altra tabella. Uno dei modi migliori per eseguire questa operazione consiste nell'utilizzare le istruzioni "INSERT INTO SELECT". Tuttavia, se la tabella di destinazione ha una colonna di identità, è necessario abilitare l'opzione IDENTITY_INSERT nella tabella di destinazione. Inoltre, dobbiamo scrivere l'elenco delle colonne della tabella di destinazione.

DROP TABLE IF EXISTS TestIdentity
DROP TABLE IF EXISTS SourceTable 
CREATE TABLE SourceTable (ID INT,
Val1 VARCHAR(100))
INSERT INTO SourceTable 
VALUES (1,'First Row'),(2,'Second Row')
GO
CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))
SET IDENTITY_INSERT TestIdentity ON
INSERT INTO TestIdentity  (Id,Col1) 
SELECT * FROM SourceTable
SET IDENTITY_INSERT TestIdentity OFF

Lo svantaggio dell'opzione IDENTITY_INSERT è che può causare uno spazio vuoto tra i valori della colonna Identity. Un'istruzione simile alla seguente genererà un divario tra i valori delle colonne di identità.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

INSERT INTO TestIdentity  ---column list
VALUES ('The first inserted row (INDENTITY_INSERT_OFF)')

SET IDENTITY_INSERT TestIdentity ON

INSERT INTO TestIdentity  (Id,Col1) ---column list
VALUES (90,'The second inserted row (INDENTITY_INSERT_ON')

SET IDENTITY_INSERT TestIdentity OFF


INSERT INTO TestIdentity   ---column list
VALUES ('The third inserted row (INDENTITY_INSERT_OFF)')


SELECT * FROM TestIdentity

Comando DBCC CHECKIDENT

Il comando DBCC CHECKIDENT ci consente di ottenere i dettagli sull'ultimo valore della colonna Identity. Questa funzione consente anche di reimpostare e modificare il valore corrente della colonna identità in un altro valore. Ora otterremo l'ultimo valore dell'identità tramite il comando DBCC CHECKIDENT.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

GO

INSERT INTO TestIdentity
VALUES ('The first inserted row')

INSERT INTO TestIdentity
VALUES ('The second inserted row')

INSERT INTO TestIdentity
VALUES ('The third inserted row')

INSERT INTO TestIdentity
VALUES ('The fourth inserted row')

DBCC CHECKIDENT ('TestIdentity', NORESEED)

Un'altra opzione relativa al comando DBCC CHECKIDENT consiste nel reimpostare la colonna Identity su un valore richiesto. Nell'esempio seguente, il parametro RESEED modifica il valore massimo della colonna Identity in 100 e i valori inseriti successivamente utilizzano questo valore massimo.

DROP TABLE IF EXISTS TestIdentity
CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))
GO
INSERT INTO TestIdentity
VALUES ('The first inserted row')
INSERT INTO TestIdentity
VALUES ('The second inserted row')
INSERT INTO TestIdentity
VALUES ('The third inserted row')
INSERT INTO TestIdentity
VALUES ('The fourth inserted row')
GO
DBCC CHECKIDENT ('TestIdentity',RESEED,100)
GO
INSERT INTO TestIdentity
VALUES ('The fifth inserted row')

SELECT  * FROM TestIdentity

Colonna e unicità dell'identità di SQL Server

Le colonne Identity non garantiscono la generazione di valori univoci. Questo è il problema di confusione comune sulle colonne di identità, quindi se vogliamo garantire l'unicità dei valori generati, possiamo utilizzare l'indice univoco per queste colonne. Ora dimostreremo e dimostreremo come creare valori duplicati sulle colonne identità.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))
SET IDENTITY_INSERT TestIdentity ON
INSERT INTO TestIdentity  (Id,Col1)
VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)')

INSERT INTO TestIdentity  (Id,Col1)
VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)')


SET IDENTITY_INSERT TestIdentity OFF


SELECT  * FROM TestIdentity

Inoltre, le colonne identità e le chiavi primarie sono due oggetti dissimili in SQL Server. Lo scopo di utilizzo della colonna Identity è generare il numero con incremento automatico. D'altra parte, il vincolo della chiave primaria garantisce e fornisce l'unicità dei valori in una determinata colonna. Il vincolo Chiave primaria applica i valori univoci per le colonne definite perché, per impostazione predefinita, Chiave primaria crea un indice univoco cluster nella tabella. Nell'uso comune, il vincolo della chiave primaria e la proprietà dell'identità possono essere utilizzati insieme. Questo approccio all'utilizzo ci aiuta a portare la flessibilità dell'unicità della chiave primaria e la funzione di incremento automatico dell'identità alla colonna applicata. Nell'esempio seguente, aggiungeremo anche un vincolo di chiave primaria alla colonna Id e impedirà di duplicare i valori inseriti.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) PRIMARY KEY,
Col1 VARCHAR(100))
SET IDENTITY_INSERT TestIdentity ON
INSERT INTO TestIdentity  (Id,Col1)
VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)')

INSERT INTO TestIdentity  (Id,Col1)
VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)')
SET IDENTITY_INSERT TestIdentity OFF


SELECT  * FROM TestIdentity

Quando navighiamo nella scheda Indici della tabella TestIdentity in Esplora oggetti, possiamo scoprire un indice cluster univoco creato dal vincolo della chiave primaria. Questo vincolo si applica a valori univoci per la colonna ID.

Conclusione

In questo articolo sono stati discussi i concetti fondamentali ei metodi di utilizzo della proprietà Identity di SQL Server e delle colonne Identity.

Riferimenti

  • CREA IDENTITÀ (Proprietà) TABELLA (Transact-SQL)
  • Crea chiavi primarie