Home > FAQ > Una colonna IDENTITY ammette valori duplicati? e valori negativi?

Una colonna IDENTITY ammette valori duplicati? e valori negativi?

Sono due tipici dubbi, il secondo dei quali è causato, probabilmente, dal fatto che una colonna IDENTITY viene usata solitamente come PRIMARY KEY di tabella, assicurando come tale l’univocità dei valori in colonna.

La risposta è "Sì" ad entrambe le domande. Nel caso di valori negativi fanno eccezione ovviamente le colonne di tipo TINYINT (che ammette numeri interi da 0 a 255). Inoltre, il fatto di ammettere valori negativi, può tornare utile in quanto possiamo ottimizzare l’utilizzo del range di valori ammessi dal tipo di dato con cui definiamo la colonna. Per esempio, per un SMALLINT (che occupa 2 byte e ammette da -32.768 a 32.767) possiamo "sfruttare" completamente tale range partendo proprio dal suo limite inferiore di -32.768

 

USE tempdb
GO

DROP TABLE T1;
CREATE TABLE T1 (
    col1_identity INT IDENTITY(1,1),
    col2 VARCHAR(10)
)
GO

–inserisco 5 righe che porteranno il valore corrente identity a 5
INSERT T1 (col2) VALUES (NULL)
GO 5

–impostazione necessaria per inserire esplicitamente valori nella colonna identity
SET IDENTITY_INSERT T1 ON
GO

–inserisco dei valori duplicati nella colonna identity
INSERT T1 (col1_identity, col2) VALUES (1, ‘2nd uno’)
INSERT T1 (col1_identity, col2) VALUES (2, ‘2nd due’)
–inserisco un valore negativo nella colonna identity
INSERT T1 (col1_identity, col2) VALUES (-5, ‘meno 5’)

–vediamo qual’è il valore corrente della colonna identity, quindi la reimpostiamo a -5, infine la ricontrolliamo
DBCC CHECKIDENT (T1, NORESEED)
DBCC CHECKIDENT (T1, RESEED, -5)
DBCC CHECKIDENT (T1, NORESEED)
–ok è -5
GO

–ritorniamo come prima a NON poter inserire esplicitamente valori nella colonna identity
SET IDENTITY_INSERT T1 OFF
GO

–inserisco 5 righe che porteranno il valore corrente identity da -5 a 0
INSERT T1 (col2) VALUES (‘negative!’);
GO 5

SELECT * FROM T1;
GO

 

–sfrutto al massimo lo SMALLINT

DROP TABLE T2;
CREATE TABLE T2 (
    ID SMALLINT IDENTITY (-32768, 1),
    Des VARCHAR(10)
)
GO

INSERT T2 (Des) VALUES (NULL)
GO 10

 

Chi è Davide Mauri

Microsoft Data Platform MVP dal 2007, Davide Mauri si occupa di Data Architecture e Big Data nel mondo dell'IoT. Attualmente ricopre il ruolo di "Director Software Development & Cloud Infrastructure" in Sensoria, societa specializzata nella creazione di Wearables e sensori per l'IoT applicati a tessuti ed oggetti sportivi.

Leggi Anche

Usare json su SQLServer 2005, 2008, 2012 e 2014 .. è possibile!

Vedere il supporto nativo di JSON su SQLServer 2016 (e anche su Azure SQLDatabase) mi …