TSQL Alter PRIMARY KEY Cluster Index MSSQL2008r2

возможно ли ИЗМЕНИТЬ КЛАСТЕРИРОВАННЫЙ индекс ПЕРВИЧНОГО КЛЮЧА в существующей таблице без потери данных?

Если да, то какая для этого нужна команда ALTER?

ИЗМЕНИТЬ Я хочу добавить дополнительный столбец в кластеризованный индекс ПЕРВИЧНЫХ КЛЮЧЕЙ

Спасибо


person Mazhar    schedule 18.09.2014    source источник
comment
что вы пытаетесь изменить? Столбцы, составляющие первичный ключ?   -  person Kritner    schedule 18.09.2014
comment
Я хочу добавить дополнительный столбец в кластеризованный индекс PRIMARY KEY CLUSTERED   -  person Mazhar    schedule 18.09.2014
comment
Нет, напрямую изменить определение ограничения невозможно. ALTER TABLE позволяет только добавлять или удалять ограничение, но не изменять его определение. Кроме того, ограничения поддерживаются индексами. Если вы посмотрите на ALTER INDEX, то увидите, что нет возможности изменить столбцы, включенные в индекс. Но удаление и добавление ограничения не должно привести к потере фактических данных.   -  person Damien_The_Unbeliever    schedule 18.09.2014


Ответы (1)


Вот что я делал раньше, чтобы изменить первичный ключ в таблице:

BEGIN TRANSACTION doStuff

DECLARE @isValid bit
SET     @isValid = 1

DECLARE @pkName varchar(50)
SET     @pkName = (
    SELECT TOP 1 name
    FROM sys.key_constraints
    WHERE type ='pk'
        AND OBJECT_NAME(parent_object_id) = N'TableName'
)

DECLARE @sql nvarchar(2000)
SET @sql = N'
ALTER TABLE dbo.TableName
DROP CONSTRAINT ' + @pkName

EXEC (@sql)

IF (@@ERROR <> 0)
    BEGIN
        PRINT 'Error deleting primary key'
        SET @isValid = 0
    END

ALTER TABLE dbo.TableName
ADD PRIMARY KEY (primary key columns separated by comma)

IF (@@ERROR <> 0)
    BEGIN
        PRINT 'Error creating primary key'
        SET @isValid = 0
    END

IF (@isValid = 1)
    BEGIN
        PRINT 'Commit'
        COMMIT TRANSACTION doStuff
    END
ELSE
    BEGIN
        PRINT 'Rollback'
        ROLLBACK TRANSACTION doStuff
    END

Обратите внимание, как указано в: Лучший способ чтобы изменить кластерный индекс (PK) в SQL 2005, это изменит порядок данных в вашей таблице на протяжении всей операции, поэтому в зависимости от размера таблицы это может занять значительное время.

person Kritner    schedule 18.09.2014
comment
Спасибо за это. Как это повлияет на некластеризованные индексы в той же таблице? Будут ли они ВОССТАНОВИТЬСЯ в одно и то же время или что-то в этом роде? - person Mazhar; 18.09.2014
comment
sqlskills.com/blogs/paul/ любое изменение ключей кластера приводит к перестройке всех некластеризованных индексов после создания нового кластеризованного индекса. - person Kritner; 18.09.2014