sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo usar la propiedad IDENTITY() en SQL Server

Cuando usa T-SQL para crear (o modificar) una tabla en SQL Server, tiene la opción de usar IDENTITY() propiedad para crear una columna de identidad.

Una columna de identidad contiene un número de identificación que se incrementa automáticamente. La IDENTITY() La propiedad se puede usar con CREATE TABLE y ALTER TABLE declaraciones.

Sintaxis

La sintaxis es así:

IDENTITY [ (seed , increment) ]

La semilla es el valor que se usa para la primera fila cargada en la tabla.

El incremento es el valor incremental que se agrega al valor de identidad de la fila anterior que se cargó.

Debe especificar ambos argumentos o ninguno. Si no especifica ninguno, el valor predeterminado es (1,1) .

Ejemplo 1:uso básico

Aquí hay un ejemplo para demostrarlo.

CREATE TABLE Pets (
    PetId int IDENTITY(1,1) PRIMARY KEY, 
    PetName varchar(255)
    );

Este código crea una tabla con dos columnas. La primera columna (PetId ) es una columna de identidad porque utilizo IDENTITY() propiedad en su definición.

Ahora que he creado una columna de identidad, puedo insertar nombres de mascotas en PetName columna sin necesidad de incluir un ID para cada fila.

INSERT INTO Pets (PetName)
VALUES ('Homer'), ('Felix'), ('Ruff');

SELECT * FROM Pet;

Resultado:

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

Ejemplo 2:semilla e incremento diferentes

Aquí hay un ejemplo que usa una semilla e incremento diferentes.

En este caso, la semilla comienza en 150 y se incrementa en 10 por cada fila.

CREATE TABLE Cities (
    CityId int IDENTITY(150, 10) PRIMARY KEY, 
    CityName varchar(255)
    );

Ahora inserte algunos datos y selecciónelos:

INSERT INTO Cities (CityName)
VALUES ('Auckland'), ('Danang'), ('Khon Kaen');

SELECT * FROM Cities;

Resultado:

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

Ejemplo 3:uso incorrecto

Como se mencionó, debe especificar ambos argumentos o ninguno. En otras palabras, no puede proporcionar solo un argumento. Este es un ejemplo de lo que sucede cuando solo proporciona un 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 ')'.

Ejemplo 4:intentar anular los valores de identidad

Si intenta anular los valores de identidad automáticos, es posible que obtenga un error 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.

Esto se debe a que está intentando anular los valores creados por IDENTITY() propiedad. En muchos casos, podría ser que simplemente no supiera que era una columna de identidad. En tales casos, todo lo que necesita hacer es eliminar la columna de identidad de su INSERT declaración.

Sin embargo, si realmente haces necesita anular la IDENTITY() propiedad, consulte Cómo insertar valores en una columna IDENTITY en SQL Server.

Como se mencionó, si no necesita anular los valores de identidad, simplemente puede eliminar esa columna de su INSERT declaración.

Entonces puedo modificar la declaración anterior a esto:

INSERT INTO Cities (CityName)
VALUES ('Bangkok');

SELECT * FROM Cities;

Resultado:

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

Limitaciones de la propiedad IDENTITY()

La propiedad de identidad en una columna garantiza lo siguiente:

  • Cada valor nuevo se genera en función de la inicialización y el incremento actuales.
  • Cada valor nuevo para una transacción en particular es diferente de otras transacciones concurrentes en la tabla.

No garantiza lo siguiente:

  • Singularidad del valor
  • Valores consecutivos dentro de una transacción
  • Valores consecutivos después del reinicio del servidor u otras fallas
  • Reutilización de valores (por ejemplo, cuando un INSERT la operación falla)

Para obtener más información sobre estas limitaciones, consulte la documentación de Microsoft.