2011-12-28 26 views
10

Tengo una tabla de aproximadamente 10 millones de filas. Acabamos de importarlo de otra base de datos con SQL Server Management Studio. Crea tabla pero sin identidad y clave primaria en la columna de clave principal.Cómo agregar identidad a la columna en SQL Server?

Podría agregar la clave principal pero no podría agregar identidad. Todo el tiempo se agota cuando lo hago en diseñador. Incluso configuré la configuración de tiempo de espera en 0.

Necesito crear probablemente otro conjunto de columnas clave principal e identidad, copiar datos desde el anterior, eliminar una columna anterior y cambiar el nombre de una nueva.

¿Alguien puede mostrarme cuál será la mejor manera de hacerlo para mesas tan grandes, sin recalentamiento adicional?

+0

¿Algo así le dio un tiempo de espera? 'alter table TableName add ID int identity (1, 1) clave principal' –

+1

Puede usar' ALTER TABLE ... SWITCH' para hacer esto casi al instante. Incluso en una mesa de 10 millones de filas. –

+0

posible duplicado de [cómo establecer el incremento automático después de crear una tabla sin pérdida de datos?] (Http://stackoverflow.com/questions/6084572/how-to-set-auto-increment-after-creating-a-table -sin-any-data-loss) –

Respuesta

4

bien. Pude agregar identidad a la columna principal existente con 10 millones de registros. Me llevó unos 30 minutos.

Los pasos:

  1. Cambio de base de datos en modo monousuario (para asegurarse de que no hay otras conexiones a DATABSE, puede causar bloqueo)

  2. tabla abierta en el modo de diseñador

  3. Hacer cambio. No guardar

  4. clic en Generar botón Cambiar de secuencias de comandos (por lo general a la izquierda, justo encima del Explorador de objetos)

  5. El ejemplar generados por el script
  6. Cerrar ventana del diseñador (se puede ejecutar sólo una instancia en el momento)
  7. Abre ventana nueva
  8. guión Ejecutar

  9. Hecho. Ahora su columna tiene identidad :)

+1

Compruebe la secuencia de comandos. Estoy seguro de que crea una nueva tabla, copia todos los datos y luego descarta la tabla original. – Bill

+1

¡Podría haberlo hecho en 30 segundos si hubiera seguido mi enlace! –

11

Usted no puede agregar IDENTITY a una columna existente. Simplemente no se puede hacer.

Tendrá que crear una nueva columna de tipo INT IDENTITY y luego dejar caer la columna de edad que no necesita más (y posiblemente cambiar el nombre de la nueva columna al nombre antiguo - si es que se necesita)

Además: Lo haría no haga esto en el diseñador visual - esto intentará recrear la tabla con la nueva estructura, copie todos los datos (las 10 millones de filas), y luego suelte la tabla anterior.

Es mucho más eficiente usar instrucciones T-SQL rectas: esto hará una actualización "in situ", no destructiva (no se pierde ningún dato), y no necesita para copiar alrededor de 10 millones filas en el proceso ...

ALTER TABLE dbo.YourTable 
    ADD NewID INT IDENTITY(1,1) NOT NULL 

Cuando se agrega una nueva columna de tipo INT IDENTITY a su mesa, luego se rellenan automáticamente con números consecutivos. No puede evitar que esto suceda, y tampoco puede actualizar los valores más adelante.

Ninguna de esas opciones es realmente muy útil, al final - que podría terminar con diferentes valores de ID .... para hacer esto bien, habría que:

  • crear la nueva tabla antes de tiempo, con la estructura adecuada y la IDENTITY ya en el lugar
  • después enciende SET IDENTITY_INSERT (yourtable) ON en esa mesa para permitir valores a ser insertado en la columna de identidad
  • copia sobre estos datos de la fuente original
  • desvío identidad insertada agai n: SET IDENTITY_INSERT (yourtable) OFF

Solo con este enfoque podrá obtener los mismos ID en una columna de IDENTIDAD en su nueva tabla.

+1

A todos los efectos, puede agregar 'identity' a una columna existente creando una nueva tabla con la misma estructura, excepto por la propiedad de identidad. Cambiando la vieja tabla a la nueva mesa, luego soltando la vieja y cambiando el nombre de la mesa. Esto deja intactas las páginas de datos. –

+0

No estoy de acuerdo con usted. Intenté agregar la clave principal y la columna de identidad en una tabla que tiene 800,000 filas en modo diseñador. Y se completó con éxito. – German

+0

@MartinSmith: ¿y eso también funciona con dos tablas sin particiones? –

2

Una forma de establecer una columna identity es durante un insert con la opción set identity_insert.Por ejemplo, para cambiar id en esta tabla para identity:

create table YourTable (id int, value varchar(50)) 

usted podría utilizar este script:

-- Create empty table as a copy of the original 
select top 0 * into YourTable_New from YourTable 

-- Drop the old ID column 
alter table YourTable_New drop column id 

-- Add a new ID column with identity 
alter table YourTable_New add id int identity 

-- Copy the old values into the identity column 
set identity_insert YourTable_New on 
insert YourTable_New (id, value) select id, value from YourTable 
set identity_insert YourTable_New off 

-- Drop the old table and rename the new one 
drop table YourTable 
exec sp_RENAME 'YourTable_New' , 'YourTable' 
3

Puede agregar IDENTIDAD a una columna existente. Solo se puede hacer. en SSMS Simplemente vaya a herramientas -> opciones -> Diseñadores -> Diseñadores de tablas y bases de datos y desmarque la opción Impedir Guardar cambios que requieren la recreación de la tabla.

Ahora agregue la identidad en modo diseñador a la columna requerida y guárdela.

Cuestiones relacionadas