Kiedy używasz T-SQL do tworzenia (lub zmiany) tabeli w SQL Server, masz możliwość użycia IDENTITY()
właściwość, aby utworzyć kolumnę tożsamości.
Kolumna tożsamości zawiera automatycznie rosnący numer identyfikacyjny. IDENTITY()
może być używana z CREATE TABLE
i ALTER TABLE
oświadczenia.
Składnia
Składnia wygląda tak:
IDENTITY [ (seed , increment) ]
ziarno jest wartością używaną dla pierwszego wiersza załadowanego do tabeli.
przyrost to wartość przyrostowa dodawana do wartości tożsamości poprzedniego załadowanego wiersza.
Musisz określić oba argumenty lub żaden. Jeśli nie określisz żadnego, wartością domyślną jest (1,1)
.
Przykład 1 – Podstawowe użycie
Oto przykład do zademonstrowania.
CREATE TABLE Pets ( PetId int IDENTITY(1,1) PRIMARY KEY, PetName varchar(255) );
Ten kod tworzy tabelę z dwiema kolumnami. Pierwsza kolumna (PetId
) jest kolumną tożsamości, ponieważ używam IDENTITY()
właściwość w swojej definicji.
Teraz, po utworzeniu kolumny tożsamości, mogę wstawić imiona zwierząt do PetName
kolumna bez konieczności dołączania identyfikatora dla każdego wiersza.
INSERT INTO Pets (PetName) VALUES ('Homer'), ('Felix'), ('Ruff'); SELECT * FROM Pet;
Wynik:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 1 | Homer | | 2 | Felix | | 3 | Ruff | +---------+-----------+
Przykład 2 – Różne nasiona i przyrost
Oto przykład, który wykorzystuje inne ziarno i przyrost.
W tym przypadku nasiona zaczynają się od 150 i są zwiększane o 10 w każdym rzędzie.
CREATE TABLE Cities ( CityId int IDENTITY(150, 10) PRIMARY KEY, CityName varchar(255) );
Teraz wstaw jakieś dane i wybierz je:
INSERT INTO Cities (CityName) VALUES ('Auckland'), ('Danang'), ('Khon Kaen'); SELECT * FROM Cities;
Wynik:
+----------+------------+ | CityId | CityName | |----------+------------| | 150 | Auckland | | 160 | Danang | | 170 | Khon Kaen | +----------+------------+
Przykład 3 – nieprawidłowe użycie
Jak wspomniano, musisz określić oba argumenty lub żaden. Innymi słowy, nie możesz podać tylko jednego argumentu. Oto przykład tego, co się dzieje, gdy podasz tylko jeden argument.
CREATE TABLE Cities ( CityId int IDENTITY(1) PRIMARY KEY, CityName varchar(255) );
Wynik:
Msg 102, Level 15, State 1, Line 2 Incorrect syntax near ')'.
Przykład 4 – próba zastąpienia wartości tożsamości
Jeśli spróbujesz zastąpić automatyczne wartości tożsamości, możesz otrzymać taki błąd.
INSERT INTO Cities (CityId, CityName) VALUES (123, 'Bangkok');
Wynik:
Msg 544, Level 16, State 1, Line 1 Cannot insert explicit value for identity column in table 'Cities' when IDENTITY_INSERT is set to OFF.
Dzieje się tak, ponieważ próbujesz zastąpić wartości utworzone przez IDENTITY()
własność. W wielu przypadkach może się zdarzyć, że po prostu nie wiedziałeś, że to kolumna tożsamości. W takich przypadkach wystarczy usunąć kolumnę tożsamości z INSERT
oświadczenie.
Jeśli jednak naprawdę tak trzeba zastąpić IDENTITY()
właściwość, zobacz Jak wstawić wartości do kolumny IDENTITY w SQL Server.
Jak wspomniano, jeśli nie musisz zastępować wartości tożsamości, możesz po prostu usunąć tę kolumnę z INSERT
oświadczenie.
Mogę więc zmienić poprzednie stwierdzenie na to:
INSERT INTO Cities (CityName) VALUES ('Bangkok'); SELECT * FROM Cities;
Wynik:
+----------+------------+ | CityId | CityName | |----------+------------| | 150 | Auckland | | 160 | Danang | | 170 | Khon Kaen | | 180 | Bangkok | +----------+------------+
Ograniczenia właściwości IDENTITY()
Właściwość tożsamości w kolumnie gwarantuje, że:
- Każda nowa wartość jest generowana na podstawie bieżącego ziarna i przyrostu.
- Każda nowa wartość dla określonej transakcji różni się od innych równoczesnych transakcji w tabeli.
Nie gwarantuje:
- Wyjątkowość wartości
- Kolejne wartości w ramach transakcji
- Kolejne wartości po ponownym uruchomieniu serwera lub innych awariach
- Ponowne użycie wartości (na przykład, gdy
INSERT
operacja kończy się niepowodzeniem)
Więcej informacji na temat tych ograniczeń można znaleźć w dokumentacji firmy Microsoft.