Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да използвате свойството IDENTITY() в SQL Server

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изберете и редактирайте вертикални блокове в SQL Server Management Studio (SSMS) - SQL Server / TSQL урок, част 9

  2. SQL Server:DELETE срещу TRUNCATE

  3. Как да създадете съхранена процедура в SQL Server

  4. Каква е разликата между varchar и nvarchar?

  5. datetime2 срещу datetimeoffset в SQL Server:Каква е разликата?