Когато използвате T-SQL за създаване (или промяна) на таблица в SQL Server, имате възможност да използвате IDENTITY()
свойство за създаване на колона за идентичност.
Колоната за идентичност съдържа автоматично нарастващ идентификационен номер. IDENTITY()
свойството може да се използва с CREATE TABLE
и ALTER TABLE
изявления.
Синтаксис
Синтаксисът е така:
IDENTITY [ (seed , increment) ]
Семето е стойността, която се използва за първия ред, зареден в таблицата.
Увеличението е инкременталната стойност, която се добавя към стойността на идентичността на предишния ред, който е зареден.
Трябва да посочите и двата аргумента или нито един. Ако не посочите нито едно, по подразбиране е (1,1)
.
Пример 1 – Основна употреба
Ето пример за демонстрация.
CREATE TABLE Pets ( PetId int IDENTITY(1,1) PRIMARY KEY, PetName varchar(255) );
Този код създава таблица с две колони. Първата колона (PetId
) е колона за идентичност, защото използвам IDENTITY()
свойство в неговата дефиниция.
Сега, след като създадох колона за идентичност, мога да вмъкна имена на домашни любимци в PetName
колона, без да е необходимо да включвате идентификатор за всеки ред.
INSERT INTO Pets (PetName) VALUES ('Homer'), ('Felix'), ('Ruff'); SELECT * FROM Pet;
Резултат:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 1 | Homer | | 2 | Felix | | 3 | Ruff | +---------+-----------+
Пример 2 – Различни семена и прираст
Ето пример, който използва различно семе и приращение.
В този случай семето започва от 150 и се увеличава с 10 за всеки ред.
CREATE TABLE Cities ( CityId int IDENTITY(150, 10) PRIMARY KEY, CityName varchar(255) );
Сега вмъкнете някои данни и ги изберете:
INSERT INTO Cities (CityName) VALUES ('Auckland'), ('Danang'), ('Khon Kaen'); SELECT * FROM Cities;
Резултат:
+----------+------------+ | CityId | CityName | |----------+------------| | 150 | Auckland | | 160 | Danang | | 170 | Khon Kaen | +----------+------------+
Пример 3 – Неправилно използване
Както споменахме, трябва да посочите и двата аргумента или нито един. С други думи, не можете да предоставите само един аргумент. Ето пример за това какво се случва, когато предоставите само един аргумент.
CREATE TABLE Cities ( CityId int IDENTITY(1) PRIMARY KEY, CityName varchar(255) );
Резултат:
Msg 102, Level 15, State 1, Line 2 Incorrect syntax near ')'.
Пример 4 – Опит за отмяна на стойностите на идентичността
Ако се опитате да замените автоматичните стойности на самоличността, може да получите грешка като тази.
INSERT INTO Cities (CityId, CityName) VALUES (123, 'Bangkok');
Резултат:
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.
Това е така, защото се опитвате да замените стойностите, създадени от IDENTITY()
Имот. В много случаи може да се окаже, че просто не сте знаели, че това е колона за самоличност. В такива случаи всичко, което трябва да направите, е да премахнете колоната за идентичност от вашия INSERT
изявление.
Въпреки това, ако наистина направите трябва да замените IDENTITY()
свойство, вижте Как да вмъкнете стойности в колона IDENTITY в SQL Server.
Както споменахме, ако не е необходимо да замените стойностите на идентичността, можете просто да премахнете тази колона от вашия INSERT
изявление.
Така че мога да променя предишното изявление към това:
INSERT INTO Cities (CityName) VALUES ('Bangkok'); SELECT * FROM Cities;
Резултат:
+----------+------------+ | CityId | CityName | |----------+------------| | 150 | Auckland | | 160 | Danang | | 170 | Khon Kaen | | 180 | Bangkok | +----------+------------+
Ограничения на свойството IDENTITY()
Свойството identity на колона гарантира следното:
- Всяка нова стойност се генерира въз основа на текущото начало и приращение.
- Всяка нова стойност за конкретна транзакция е различна от другите едновременни транзакции в таблицата.
Това не гарантира следното:
- Уникалност на стойността
- Последователни стойности в рамките на транзакция
- Последователни стойности след рестартиране на сървъра или други грешки
- Повторно използване на стойности (например, когато
INSERT
операцията е неуспешна)
За повече информация относно тези ограничения вижте документацията на Microsoft.