Se hai mai provato a inserire valori in una colonna di identità in SQL Server, potresti aver visualizzato un errore come questo:
Impossibile inserire un valore esplicito per la colonna Identity nella tabella "Artisti" quando IDENTITY_INSERT è impostato su OFF.
E 'normale. Una colonna di identità è presente per un motivo. Popola automaticamente la colonna con un valore incrementale per ogni riga inserita. Pertanto non è necessario che tu inserisca un valore in quella colonna.
Tuttavia, a volte lo fai è necessario inserire un valore in una colonna di identità. Ad esempio, potresti popolare il database con dati che devono mantenere i propri valori di identità. In questo caso, dovrai sovrascrivere IDENTITY
proprietà. Ecco come.
Abilita IDENTITY_INSERT
Puoi sovrascrivere IDENTITY
proprietà abilitando IDENTITY_INSERT
. Ciò ti consente di inserire i tuoi valori in una colonna di identità.
Ecco un esempio:
SET IDENTITY_INSERT Artists ON; INSERT INTO Artists (ArtistId, ArtistName, ActiveFrom) VALUES (1001, 'AC/DC','1973-01-11'), (1002, 'Allan Holdsworth','1969-01-01'), (1003, 'Buddy Rich','1919-01-01'); SET IDENTITY_INSERT Artists OFF;
In questo esempio, la tabella Artists ha una colonna Identity (in questo caso ArtistId è la colonna Identity). Per sovrascrivere IDENTITY
proprietà precede semplicemente il INSERT
dichiarazione con SET IDENTITY_INSERT Artists ON
. Questa istruzione T-SQL ti consente di dire "So che questa tabella ha una colonna Identity ma in questo caso inserisci my valori invece”.
Nota che IDENTITY_INSERT
può essere abilitato solo su un tavolo alla volta. Pertanto è una buona idea disabilitare IDENTITY_INSERT
subito dopo l'inserto. Questo lo riporta al suo stato originale e ti consente di sovrascrivere una colonna di identità su una tabella diversa, se necessario.
Inoltre, per abilitare IDENTITY_INSERT
l'utente deve possedere la tabella o avere ALTER
permesso sul tavolo.
Copiare tra tabelle
Abilitazione di IDENTITY_INSERT
può anche essere utile quando copi i dati tra le tabelle. Ad esempio, potresti compilare una tabella da un'altra.
Ecco un esempio di copia dei dati dalla tabella Artists alla tabella Artists_Archive:
SET IDENTITY_INSERT Artists_Archive ON; INSERT INTO Artists_Archive (ArtistId, ArtistName, ActiveFrom) SELECT ArtistId, ArtistName, ActiveFrom FROM Artists; SET IDENTITY_INSERT Artists_Archive OFF;
Una cosa da notare è che, se la colonna Identity ha un vincolo di chiave primaria, rifiuterà tutti i valori già esistenti nella tabella di destinazione. Quindi devi essere assolutamente sicuro che l'override della colonna dell'identità sia ciò che vuoi assolutamente fare.