2009-04-07 10 views
31

Tengo una situación extraña con algunas tablas en mi base de datos comenzando con sus ID desde 0, aunque TABLE CREATE tiene IDENTIDAD (1,1). Esto es así para algunas tablas, pero no para otras. Ha funcionado hasta hoy. columna de identidadLos valores de la columna de identidad del servidor SQL comienzan en 0 en lugar de 1

He intentado reajustar:

DBCC CHECKIDENT (SyncSession, reseed, 0); 

embargo, los nuevos registros empiezan con 0. He intentado hacer esto para todas las tablas, pero algunos todavía empezar desde 0 y algunos de 1.

¿Alguna sugerencia?

(estoy usando SQL Server 2005 con Servicios Avanzados)

+0

Hay algo mal con su diseño si está resiembrando constantemente el valor. ¿Y por qué debería importar si comienza con 0 o 1?Es una autoincrementación, no debería importar lo que el valor sea solo que es único y asignado automáticamente. – HLGEM

+2

Cinco años tarde para la fiesta pero, como yo, el OP podría haber estado desarrollando y probando con un conjunto conocido de datos. No necesariamente algo malo con el diseño. – GeoffM

+0

@HLGEM: aquí está el motivo por el que se relaciona. si está rellenando un objeto de código a partir de un registro de base de datos, el objeto se inicializará con una propiedad de "ID" de 0. Entonces, si el llenado es correcto, será distinto del valor predeterminado de 0. 0 puede indicar que no se encontró ningún registro o un objeto "nuevo" – nuander

Respuesta

41

De DBCC CHECKIDENT

DBCC CHECKIDENT (table_name, RESEED, new_reseed_value) 

Si no hay filas se han insertado a la tabla desde que se creó, o todas las filas se han eliminado mediante la instrucción TRUNCATE TABLE, la primera fila insertada después de ejecutar DBCC CHECKIDENT usa new_reseed_value como la identidad. De lo contrario, la siguiente fila insertada usa new_reseed_value + valor de incremento actual.

Por lo tanto, esto se espera para una tabla vacía o truncada.

+0

Solo FYI, la instrucción DELETE FROM usará el último comportamiento, "la siguiente fila insertada usa new_reseed_value + el valor de incremento actual". –

+0

ELIMINAR no reiniciará las semillas ... ¿es eso lo que quieres decir? – gbn

+0

@GBN, eso es cierto, pero a lo que me refiero es a utilizar DBCC CHECKIDENT (SyncSession, reseed, new_reseed_value); para restablecer una semilla para una tabla después de un DELETE tomará el new_reseed_value y se le agregará el valor de incremento actual para la primera fila. –

2

Esto es lógico, ya que se ha cambiado el valor de identidad (resembrado) a cero?

DBCC CHECKIDENT (SyncSession, reseed, 1) 

se reseed su columna de identidad, y asegúrese de que el primer registro nuevo se iniciará con 1.

+1

No, eso no está bien. ¡El primer valor utilizado si especifica 1 de esta manera será 2! –

+0

Ah, a menos que haga esto en una tabla vacía, en cuyo caso toma el valor que especifique. Disculpas! –

+0

He intentado esto con tablas vacías y ahora algunas tablas comienzan desde 1 y algunas desde 2. – Muxa

2

Tengo el mismo problema, la restauración de una copia de seguridad después de modificar la base de datos. Acabo de agregar un registro ficticio y luego eliminarlo ... luego establezco RESEED a 0. Parece que funciona.

1

Prueba este

DECLARE @c TABLE (TanvtechId varchar(10),NewTanvtechId Varchar(10)) 
INSERT INTO @c 
SELECT TanvtechId , Row_Number() OVER (ORDER BY TanvtechId) from Tanvtech 

UPDATE G 
SET G.TanvtechId =a.NewTanvtechId 
FROM Tanvtech as G INNER JOIN @c as a ON a.TanvtechId =G.TanvtechId 
3

Si pasa un valor de reinicialización de la base de datos se iniciará la identidad de ese nuevo valor:

DBCC CHECKIDENT (SyncSession, RESEED, 0); --next record should be 0 + increment 

Usted no tiene que pasar el un valor sin embargo, si no IDENTITY(a,b) su lugar se utilizará:

DBCC CHECKIDENT (SyncSession, RESEED); --next record should be the seed value 'a' 

Esto es por lo general una mejor práctica, ya que deja el ta más cerca de su estado creado inicial.

-1
DBCC CHECKIDENT (Table_Name, RESEED, 0) 

Esta es una manera de empezar un id con Zero(0), a continuación, elimine todas las filas de la tabla y de nuevo poner los datos de nuevo en la mesa.

Cuestiones relacionadas