W tym artykule omówimy podstawy i szczegóły dotyczące właściwości IDENTITY programu SQL Server oraz funkcji kolumny IDENTITY. Zastanowimy się również, jak wstawić jawne wartości do kolumn tożsamości za pomocą funkcji IDENTITY_INSERT.
Wprowadzenie do właściwości SQL Server IDENTITY i kolumny IDENTITY
W SQL Server właściwość identity pozwala na tworzenie kolumn tożsamości w tabelach SQL Server zgodnie z ustawieniami składni właściwości identity. Składnia właściwości tożsamości wygląda następująco i stosujemy tę składnię do tworzenia lub zmiany instrukcji tabeli.
TOŻSAMOŚĆ [(ziarno, przyrost)]
Najpierw przyjrzymy się parametrom właściwości tożsamości. Ta właściwość przyjmuje dwa parametry wejściowe:pierwszy to seed, a drugi to przyrost. Parametr seed określa, że pierwsza wartość początkowa wstawianej wartości do tabeli, a parametr Increment określa wartość inkrementacji wstawionych danych.
Teraz zintensyfikujemy tę podstawową definicję własności tożsamości za pomocą kilku przykładów.
Jak utworzyć kolumnę tożsamości w SQL Server
Przykład 1 :W poniższym przykładzie utworzymy kolumnę tożsamości, a pierwsza wartość zacznie się od 1 i zwiększy się o 1 o 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
Przykład 2 :W poniższym przykładzie utworzymy kolumnę tożsamości, a pierwsza wartość zacznie się od 37 i zwiększy 20 o 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
Jak widać w powyższym przykładzie, właściwość identity zapewnia generowanie wartości auto-inkrementacji zgodnie z parametrami seed i identity.
Jak wstawić jawne wartości do kolumny tożsamości SQL Server?
Domyślnie właściwość identity nie pozwala na wstawianie jawnych wartości do kolumn tożsamości. Jeśli spróbujesz wstawić jawne wartości do kolumny tożsamości, wystąpi następujący błąd.
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')
Wiadomość 8101, poziom 16, stan 1, wiersz 9
Wyraźna wartość kolumny tożsamości w table, „TestIdentity” można określić tylko wtedy, gdy używana jest lista kolumn, a IDENTITY_INSERT jest WŁĄCZONE.
Możemy obejść ten błąd, włączając funkcję IDENTITY_INSERT tabeli. Teraz zmienimy instrukcję insert w następujący sposób.
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
Inną kluczową kwestią dotyczącą tego problemu jest to, że musimy napisać listę kolumn do instrukcji wstawiania. Jeśli tego nie zrobimy, wystąpi następujący błąd.
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
Wiadomość 8101, poziom 16, stan 1, wiersz 9
Wyraźna wartość kolumny tożsamości w table, „TestIdentity” można określić tylko wtedy, gdy używana jest lista kolumn, a IDENTITY_INSERT jest WŁĄCZONE.
Ten błąd określa, że w instrukcji INSERT brakuje listy kolumn. W poniższym oświadczeniu insert naprawimy ten błąd.
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
W niektórych przypadkach musimy wstawić dane do jednej tabeli z innej tabeli. Jednym z najlepszych sposobów wykonania tej operacji jest użycie instrukcji „INSERT INTO SELECT”. Jeśli jednak tabela docelowa ma kolumnę tożsamości, musimy włączyć opcję IDENTITY_INSERT w tabeli docelowej. Ponadto musimy napisać listę kolumn tabeli docelowej.
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
Wadą opcji IDENTITY_INSERT jest to, że może powodować lukę między wartościami kolumny tożsamości. Instrukcja podobna do poniższej wygeneruje lukę między wartościami kolumny tożsamości.
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
polecenie DBCC CHECKIDENT
Polecenie DBCC CHECKIDENT pozwala nam uzyskać szczegółowe informacje o ostatniej wartości kolumny tożsamości. Ta funkcja umożliwia również resetowanie i zmianę bieżącej wartości kolumny tożsamości na inną wartość. Teraz otrzymamy ostatnią wartość tożsamości za pomocą polecenia 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)
Inną opcją dotyczącą polecenia DBCC CHECKIDENT jest zresetowanie kolumny tożsamości do wymaganej wartości. W poniższym przykładzie parametr RESEED zmienia maksymalną wartość kolumny tożsamości na 100, a kolejne wstawiane wartości używają tej wartości maksymalnej.
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
Kolumna tożsamości i niepowtarzalność SQL Server
Kolumny tożsamości nie gwarantują generowania unikalnych wartości. Jest to typowy mylący problem dotyczący kolumn tożsamości, więc jeśli chcemy zapewnić unikalność generowanych wartości, możemy użyć unikalnego indeksu dla tych kolumn. Teraz udowodnimy i zademonstrujemy, jak tworzyć zduplikowane wartości w kolumnach tożsamości.
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
Ponadto kolumny tożsamości i klucze podstawowe to dwa odmienne obiekty w SQL Server. Celem użycia kolumny tożsamości jest generowanie automatycznie zwiększanej liczby. Z drugiej strony ograniczenie klucza podstawowego gwarantuje i zapewnia unikalność wartości w określonej kolumnie. Ograniczenie klucza podstawowego wymusza unikatowe wartości dla zdefiniowanych kolumn, ponieważ domyślnie klucz podstawowy tworzy klastrowany unikatowy indeks w tabeli. W powszechnym użyciu ograniczenie klucza podstawowego i właściwość tożsamości mogą być używane razem. Takie podejście do użycia pomaga nam zapewnić elastyczność unikatowości klucza podstawowego i funkcji automatycznego zwiększania tożsamości w zastosowanej kolumnie. W poniższym przykładzie dodamy również ograniczenie klucza podstawowego do kolumny Id, co zapobiegnie duplikowaniu wstawionych wartości.
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
Kiedy poruszamy się po karcie Indeksy tabeli TestIdentity w eksploratorze obiektów, możemy znaleźć unikalny indeks klastrowy, który został utworzony przez ograniczenie klucza podstawowego. To ograniczenie wymusza unikalne wartości dla kolumny Id.
Wniosek
W tym artykule omówiliśmy podstawowe koncepcje i metody użycia właściwości tożsamości SQL Server i kolumn tożsamości.
Referencje
- CREATE TABLE (Transact-SQL) TOŻSAMOŚĆ (Właściwość)
- Utwórz klucze podstawowe