primary primaria modificar llave foranea eliminar drop clave cambiar agregar sql sql-server sql-server-2005 indexing

sql - primaria - Cambiar una clave principal de no agrupado a agrupado



eliminar primary key mysql (2)

1) Elimine primero el índice agrupado existente (IX_TableX_FieldB):

DROP INDEX TableX.IX_TableX_FieldB

2) Crear una restricción ÚNICA (temporal) en los campos únicos a los que se hace referencia en la clave principal

ALTER TABLE TableX ADD CONSTRAINT UQ_TableX UNIQUE(FieldA)

3) Suelta la CLAVE PRIMARIA

ALTER TABLE TableX DROP CONSTRAINT PK_TableX

4) Recrea la CLAVE PRIMARIA como CLUSTERED

ALTER TABLE TableX ADD CONSTRAINT PK_TableX PRIMARY KEY CLUSTERED(FieldA)

5) Eliminar la restricción UNICA temporal

ALTER TABLE TableX DROP CONSTRAINT UQ_TableX

6) Vuelva a agregar el IX_TableX_FieldB como NO CULPADO

CREATE NONCLUSTERED INDEX IX_TableX_FieldB ON TableX(FieldB)

Supongamos que tengo una tabla de SQL Server 2005, TableX, con 2 índices en ella:

PK_TableX = CLAVE PRIMARIA NO CLASIFICADA en FieldA
IX_TableX_FieldB = CLUSTERED en FieldB

Quiero cambiar el PK para ser CLUSTERED, y el otro índice para ser NO CULPADO.

Tengo que suponer que la base de datos estará en uso en el momento en que intento cambiar la ronda de índices, por lo que mi principal preocupación es evitar que la restricción PK no exista en algún momento del proceso. Quiero estar protegido contra cualquier riesgo de que se inserten claves duplicadas.

es decir, no puedo simplemente soltar la clave principal y volver a crearla.

Este proceso debe realizarse a través de un script SQL, no a través de SSMS.

Tengo un enfoque que creo que funcionará (lo publicaré como una respuesta potencial), pero me gustaría abrirlo en caso de que me falta algo o hay otra / mejor manera. Además, puede ser útil para otros en el futuro


Sé que esto es antiguo, pero esto creará todas las secuencias FK, el pk drop, el pk recreará, el FK lo creará. Reemplace MYTABLE con el nombre de su tabla.

IF EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N''[dbo].[FKAgainstTableList]'')) BEGIN DROP TABLE FKAgainstTableList END --CREATE TABLE FKAgainstTableList (ForeignKey VARCHAR(30),[Table] VARCHAR(30)) DECLARE @PKTableName VARCHAR(100), @PKName varchar(100), @FKName varchar(100), @sql varchar(max), @PKcolumnName varchar(30), @table VARCHAR(100), @FKColumnName VARCHAR(100), @parentColumnNumber int SET @PKTableName = ''MYTABLE'' set @PKName = (SELECT name FROM sys.indexes WHERE OBJECT_NAME(object_id) = @PKTableName AND is_primary_key = 1) set @PKcolumnName = (SELECT name FROM sys.columns WHERE OBJECT_NAME(object_id) = @PKTableName AND is_identity =1) PRINT @PKcolumnName SELECT OBJECT_NAME(sys.foreign_key_columns.parent_object_id) [Table],sys.columns.name [FKColumnName],sys.foreign_keys.name [FKName] INTO FKAgainstTableList FROM sys.foreign_keys INNER JOIN sys.foreign_key_columns ON sys.foreign_keys.object_id = sys.foreign_key_columns.constraint_object_id INNER JOIN sys.columns ON sys.columns.object_id = sys.foreign_keys.parent_object_id AND sys.columns.column_id = sys.foreign_key_columns.parent_column_id WHERE OBJECT_NAME(sys.foreign_keys.referenced_object_id) = @PKTableName DECLARE table_cur1 CURSOR FOR SELECT * FROM FKAgainstTableList PRINT @sql -------------------------------Disable constraint on FK Tables OPEN table_cur1 FETCH NEXT FROM table_cur1 INTO @table,@FKColumnName,@FKName WHILE @@FETCH_STATUS = 0 BEGIN SET @sql =''ALTER TABLE ''+@table+'' DROP CONSTRAINT ''+ @FKName PRINT @sql FETCH NEXT FROM table_cur1 INTO @table,@FKColumnName,@FKName END CLOSE table_cur1 DEALLOCATE table_cur1 --------------------------------DROP AND recreate CLUSTERED pk IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(@PKTableName) AND name = @PKName) BEGIN SET @sql = ''ALTER TABLE ''+@PKTableName+'' DROP CONSTRAINT ''+ @PKName PRINT @sql END SET @sql = ''ALTER TABLE ''+@PKTableName +'' ADD CONSTRAINT ''+@PKName+'' PRIMARY KEY CLUSTERED (''+@PKcolumnName+'' ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]'' PRINT(@sql) --------------------------------Enable FK constraints on FK tables. DECLARE table_cur2 CURSOR FOR SELECT * FROM FKAgainstTableList OPEN table_cur2 FETCH NEXT FROM table_cur2 INTO @table,@FKColumnName,@FKName WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = ''ALTER TABLE ''+@table+'' WITH NOCHECK ADD CONSTRAINT ''+ @FKName+'' FOREIGN KEY([''+@FKColumnName+'']) REFERENCES [''+@PKTableName+''] ([''+@PKcolumnName+''])'' PRINT(@sql) SET @sql = ''ALTER TABLE ''+@table+'' CHECK CONSTRAINT ''+@FKName PRINT(@sql) FETCH NEXT FROM table_cur2 INTO @table,@FKColumnName,@FKName END CLOSE table_cur2 DEALLOCATE table_cur2 DROP TABLE FKAgainstTableList