Pregunta

Diga que tengo una tabla MSSQL con dos columnas: una columna int ID que es la columna de identidad y alguna otra columna datetime o cualquiera que sea. Digamos que la tabla tiene 10 registros con ID 1-10. Ahora borro el registro con ID = 5.

¿Hay algún escenario en el que otro registro se rellene " " que falta de identificación? Es decir. ¿Cuándo se insertaría un registro y se le daría un ID de 5?

¿Fue útil?

Solución

No, a menos que habilite específicamente las inserciones de identidad (por lo general, al copiar tablas con columnas de identidad) e inserte una fila manualmente con el ID de 5. SQLServer realiza un seguimiento de la última identidad insertada en cada tabla con columnas de identidad e incrementa la última inserte el valor para obtener el siguiente valor al insertar.

Otros consejos

Solo si desactivas manualmente las identidades de identidad utilizando el comando SET IDENTITY_INSERT y luego haces una inserción con ID = 5

De lo contrario, MS-SQL siempre aumentará a un número mayor y las ranuras faltantes nunca se reutilizarán.

Un escenario no mencionado anteriormente donde otro registro se " rellena " faltan valores de IDENTIDAD cuando la IDENTIDAD se reinicia. Ejemplo (SQL Server 2008):

CREATE TABLE Test 
(
   ID INTEGER IDENTITY(1, 1) NOT NULL, 
   data_col INTEGER NOT NULL
);

INSERT INTO Test (data_col) 
   VALUES (1), (2), (3), (4);

DELETE
  FROM Test 
 WHERE ID BETWEEN 2 AND 3;

DBCC CHECKIDENT ('Test', RESEED, 1)

INSERT INTO Test (data_col) 
   VALUES (5), (6), (7), (8);

SELECT T1.ID, T1.data_col 
  FROM Test AS T1
 ORDER 
    BY data_col;

Los resultados son:

ID  data_col
1   1
4   4
2   5
3   6
4   7
5   8

Esto muestra que, no solo se rellenan los 'agujeros' con nuevos valores generados automáticamente, los valores que se generaron automáticamente antes de la reanudación de la reinicialización e incluso pueden duplicar los valores de IDENTIDAD existentes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top