Когато използвате 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.