2010-02-08 12 views
13

Tengo una tabla en SQL Server 2005 que contiene 10000054 registros; estos registros se insertan a través de una operación de inserción masiva. La tabla no contiene una clave principal y quiero tener una. Si trato de modificar la estructura de la tabla, agregando una nueva columna, PK, establecida como int con isidentity, la consola de administración me da una advertencia:Agregar clave principal a una tabla con muchos registros

"Los cambios en las tablas con grandes cantidades de datos pueden llevar una cantidad considerable de tiempo Mientras se guardan los cambios, no se podrá acceder a los datos de la tabla ".

continuación, las salidas de error:

".. no puede modificar la tabla tiempo de espera agotado el tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde "

Quiero un PK en mi mesa.

¿Cómo puedo agregarlo?

Respuesta

8

crea una nueva tabla con el esquema exacto y convierte la columna deseada en la clave principal. Ahora usando seleccionar para insertar, copie los registros de una tabla a otra. Cuando haya terminado, elimine la tabla anterior y cambie el nombre de esta nueva tabla al nombre deseado.

+0

Esto funcionó bien para mí. Puede haber una manera mejor, pero esta fue una solución rápida. – Induster

+0

Creo que la solución preferida (y la más simple) es cambiar la configuración del tiempo de espera de diseño, tal como se describe en MSDN aquí (https://support.microsoft.com/en-us/kb/915849). – Veverke

+0

No siempre se puede garantizar tener el espacio para hacerlo. – Robino

2

Intente generar el script SQL y emitirlo desde una ventana de consulta SQL.

22

Si en Management Studio configura la clave principal en la vista Diseño (sin guardar), cuando haga clic con el botón derecho tiene la opción "Generar script de cambio". Esta opción también está disponible en el menú "Diseñador de tablas" en parte superior.

Proporciona el SQL sin formato (envuelto de forma segura en una transacción) que puede copiar al portapapeles, ejecute como Nueva consulta (botón arriba a la izquierda, o Archivo> Nuevo> Consultar con conexión actual), péguelo en, seleccione el DB correcto y ejecute la consulta.

+0

De esta manera es posible que se quede sin espacio en disco por un tiempo. – iMatoria

0

puede hacer una tabla con la clave principal. cuando inserte datos con bcp, puede usar un archivo de formato para asignar columnas. el archivo de formato para la copia masiva es una buena solución. con esta solución, inserta datos con información de identidad.

0

De usted la respuesta a David le consigo no tiene una columna adecuada para la clave principal. En este caso, podría agregar una identidad int como la última columna de la tabla, la inserción masiva continuaría funcionando.

Como la tabla se carga con una inserción masiva, la mejor opción sería truncar la tabla (truncar la tabla MYTBL); modifíquelo, agregue el ID (alter table TBL add ID int clave primaria de identidad) y vuelva a emitir la carga masiva.

Si no puede volver a cargar la tabla, puede usar la solución de sello o hassan para modificar la tabla.

9

Sé que esto es anterior, pero me encontré con esto y lo resolvió de otra manera. Suponiendo que está utilizando SSMS 2008, puede ir a Herramientas -> Opciones

En 'Diseñadores' y 'Diseñadores de tablas y bases de datos', cambie el 'Valor de tiempo de espera de transacción después' . El valor predeterminado es 30, 0 es infinito. Intente crear la clave principal después de aumentar el valor.

Esto tiende a ser mucho más rápido que; creando un nuevo DB, copiando los datos, eliminando el antiguo Db y renombrando el nuevo db al viejo db.Una vez que haya terminado de aplicar la clave principal, puede configurar el tiempo de espera nuevamente en 30, si lo desea, a su elección.

+1

En SSMS 2008 R2, no puede establecer 'Tiempo de espera de transacción después' = 0. –

+1

Esta respuesta podría ser la preferencia de Microsoft: https://support.microsoft.com/en-us/kb/915849 –

Cuestiones relacionadas