Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como usar a propriedade IDENTITY() no SQL Server


Ao usar o T-SQL para criar (ou alterar) uma tabela no SQL Server, você tem a opção de usar o IDENTITY() propriedade para criar uma coluna de identidade.

Uma coluna de identidade contém um número de identificação que aumenta automaticamente. A IDENTITY() pode ser usada com o CREATE TABLE e ALTER TABLE declarações.


Sintaxe


A sintaxe fica assim:
IDENTITY [ (seed , increment) ]

A semente é o valor usado para a primeira linha carregada na tabela.

O incremento é o valor incremental que é adicionado ao valor de identidade da linha anterior que foi carregada.

Você deve especificar os dois argumentos ou nenhum. Se você não especificar nenhum, o padrão será (1,1) .

Exemplo 1 – Uso básico


Aqui está um exemplo para demonstrar.
CREATE TABLE Pets (
    PetId int IDENTITY(1,1) PRIMARY KEY, 
    PetName varchar(255)
    );

Este código cria uma tabela com duas colunas. A primeira coluna (PetId ) é uma coluna de identidade porque eu uso o IDENTITY() propriedade em sua definição.

Agora que criei uma coluna de identidade, posso inserir nomes de animais de estimação no PetName coluna sem precisar incluir um ID para cada linha.
INSERT INTO Pets (PetName)
VALUES ('Homer'), ('Felix'), ('Ruff');

SELECT * FROM Pet;

Resultado:
+---------+-----------+
| PetId   | PetName   |
|---------+-----------|
| 1       | Homer     |
| 2       | Felix     |
| 3       | Ruff      |
+---------+-----------+

Exemplo 2 – Sementes e incrementos diferentes


Aqui está um exemplo que usa uma semente e um incremento diferentes.

Nesse caso, a semente começa em 150 e aumenta em 10 para cada linha.
CREATE TABLE Cities (
    CityId int IDENTITY(150, 10) PRIMARY KEY, 
    CityName varchar(255)
    );

Agora insira alguns dados e selecione-os:
INSERT INTO Cities (CityName)
VALUES ('Auckland'), ('Danang'), ('Khon Kaen');

SELECT * FROM Cities;

Resultado:
+----------+------------+
| CityId   | CityName   |
|----------+------------|
| 150      | Auckland   |
| 160      | Danang     |
| 170      | Khon Kaen  |
+----------+------------+

Exemplo 3 – Uso incorreto


Conforme mencionado, você deve especificar os dois argumentos ou nenhum. Em outras palavras, você não pode fornecer apenas um argumento. Aqui está um exemplo do que acontece quando você fornece apenas um argumento.
CREATE TABLE Cities (
    CityId int IDENTITY(1) PRIMARY KEY, 
    CityName varchar(255)
    );

Resultado:
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near ')'.

Exemplo 4 – Tentando substituir os valores de identidade


Se você tentar substituir os valores de identidade automática, poderá receber um erro como este.
INSERT INTO Cities (CityId, CityName)
VALUES (123, 'Bangkok');

Resultado:
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.

Isso ocorre porque você está tentando substituir os valores criados pelo IDENTITY() propriedade. Em muitos casos, pode ser que você simplesmente não sabia que era uma coluna de identidade. Nesses casos, tudo o que você precisa fazer é remover a coluna de identidade do seu INSERT demonstração.

No entanto, se você realmente faz precisa substituir o IDENTITY() propriedade, consulte Como inserir valores em uma coluna de IDENTIDADE no SQL Server.

Conforme mencionado, se você não precisar substituir os valores de identidade, basta remover essa coluna do seu INSERT demonstração.

Então eu posso modificar a declaração anterior para isso:
INSERT INTO Cities (CityName)
VALUES ('Bangkok');

SELECT * FROM Cities;

Resultado:
+----------+------------+
| CityId   | CityName   |
|----------+------------|
| 150      | Auckland   |
| 160      | Danang     |
| 170      | Khon Kaen  |
| 180      | Bangkok    |
+----------+------------+

Limitações da propriedade IDENTITY()


A propriedade identity em uma coluna garante o seguinte:
  • Cada novo valor é gerado com base na semente e no incremento atuais.
  • Cada novo valor para uma determinada transação é diferente de outras transações simultâneas na tabela.

Não garante o seguinte:
  • Singularidade do valor
  • Valores consecutivos em uma transação
  • Valores consecutivos após a reinicialização do servidor ou outras falhas
  • Reutilização de valores (por exemplo, quando um INSERT falha na operação)

Para obter mais informações sobre essas limitações, consulte a documentação da Microsoft.