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