2010-03-12 16 views
9

Con Management Studio no puedo modificar el índice. Dejarlo no funciona porque se está utilizando como una clave externa en muchas otras tablas. ¿Puedo de alguna manera alterarlo? ¿O cómo harías esto?¿Hay alguna forma de convertir un índice no agrupado en una clave principal en una clave agrupada? (SQL Server 2008)

+2

usted debe ser capaz de eliminar el índice sin que se caiga la clave –

+0

Mmm, no soy un experto en bases de datos, pero cuando creé la clave principal, ese índice se creó automáticamente (como no agrupado). Dejarlo me da un error. Me gustaría convertirlo en uno agrupado. –

+0

qué comando está ejecutando y cuál es el error que obtiene? –

Respuesta

20

Si su PK existente es referenciado por muchas otras tablas, pasará muchos minutos tediosos y propensos a errores al escribir el guión para soltar todas las referencias FK y recrearlas.

SQL Server Management Studio puede hacer esto para usted. Lo que quizás no se haya dado cuenta es que solo puede tener un índice agrupado en una tabla, porque el índice agrupado representa el orden físico de filas; esto significa que primero debe mostrar el índice agrupado y desactivar en clustering. Entonces, y solo entonces, puede levantar otro índice y activar en clustering.

Debe hacer esto desde el diseñador de tablas, luego haga clic con el botón derecho y elija Indexes/Keys.... Primero encuentre el índice agrupado existente (probablemente la clave principal) y cambie Create as Clustered a No. Luego vaya al otro índice y cambie Create as Clustered a para eso. Si la tabla es grande, es probable que la operación expire mientras usted guarda; puede evitar esto haciendo que SSMS genere un script de cambio (haga clic derecho en el diseñador después de cambiar los índices y verá la opción). Luego puede ejecutar este script en una ventana de consulta sin tiempo de espera.

Si mira este script de cambio, verá todo el trabajo que está haciendo creando tablas de etapas y cambiando las claves; es un dolor escribir esto manualmente. Deje que SSMS lo haga por usted.

8

No puede convertirlo en el lugar: primero debe soltar la restricción de clave primaria (que también soltará automáticamente el índice no agrupado "detrás" de la restricción de clave primaria) y luego volver a crearlo como un clúster índice:

ALTER TABLE dbo.YourTable 
DROP CONSTRAINT PK_YourTable 

y vuelva a crear como en clúster:

ALTER TABLE dbo.YourTable 
ADD CONSTRAINT PK_YourTable 
PRIMARY KEY CLUSTERED (YourPKField) 
+0

Cuando intento esto, SqlServer dice: Msg 3725, nivel 16, estado 0, línea 1 La restricción 'Key_Keyers' se referencia en la tabla 'MetaDataKeyLibraries', restricción de clave externa 'FK_MetaDataKeyLibraries_Users'. –

+0

Por cierto, marc_s, también leeré algunos capítulos sobre índices en SqlServer en las próximas semanas, porque tal vez simplemente no tengo suficientes antecedentes sobre él. de todos modos por ayudarme. –

+2

Bueno, el error solo dice que otras tablas (MetaDataKeyLibraries) están haciendo referencia a esta tabla. Entonces, primero debe soltar esas restricciones FK en esas tablas, antes de que pueda soltar la restricción PK en su tabla principal (y por supuesto volver a crearlas una vez que tenga su PK agrupado en su tabla principal) –

1

Vas a tener que soltar también las limitaciones FK, cambiar el PK y luego crear las restricciones FK después de la nueva PK es en su lugar. Las restricciones de clave externa requieren que la clave a la que se hace referencia sea única; una clave primaria es, por definición, única, por lo que no se permite descartar PK, mientras que las restricciones FK están en su lugar, haciendo referencia al PK.

Al cambiar a un índice agrupado se vuelve a escribir la tabla. Cada vez que considero moverme hacia/desde un índice agrupado o cambiar el índice agrupado, reconsideraría su necesidad y elección de las claves del índice agrupado, particularmente si no va a ser único o no va a aumentar (como una fecha y hora para una marca de tiempo) . Recuerde, un índice agrupado no es realmente un índice en primer lugar, es el orden de los datos en las páginas. Esta es la razón por la cual la agrupación en una clave creciente ayuda con las divisiones de página cuando agrega datos a la tabla.

1

En realidad se puede alterar una PK no agrupado y hacer que se agruparon con esta sintaxis

CREATE UNIQUE CLUSTERED INDEX [PK_Customer] on Customer(CustomerID) WITH DROP_EXISTING 

Es necesario limpiar sus limitaciones primero: S

Cuestiones relacionadas