【问题标题】:TSQL Alter PRIMARY KEY Cluster Index MSSQL2008r2T SQL Alter PRIMARY KEY 聚集索引 MSSQL 2008 r2
【发布时间】:2014-11-12 22:03:01
【问题描述】:

是否可以在现有表上更改主键聚集索引而不丢失数据?

如果是这样,请问对此的 ALTER 命令是什么?

编辑 我想向 PRIMARY KEY CLUSTERED Index 添加一个额外的列

谢谢

【问题讨论】:

  • 你想改变什么?构成主键的列?
  • 我想向 PRIMARY KEY CLUSTERED Index 添加一个额外的列
  • 不,不可能直接更改约束定义。 ALTER TABLE 只允许您添加或删除约束,不能更改其定义。此外,约束由索引支持。如果您查看ALTER INDEX,您会发现无法更改索引中包含的列。但删除和添加约束不应导致您丢失实际数据。

标签: tsql sql-server-2008-r2 indexing primary-key clustered-index


【解决方案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

请注意:Best way to change clustered index (PK) in SQL 2005 这将在整个操作过程中对表中的数据进行重新排序,因此根据表的大小,可能会花费大量时间。

【讨论】:

  • 谢谢。这将如何影响同一张表上的非聚集索引?他们会同时重建吗?
  • sqlskills.com/blogs/paul/… "对集群键的任何更改都会强制在创建新的聚集索引后重建所有非聚集索引。"
猜你喜欢
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 2012-10-08
  • 2015-06-13
相关资源
最近更新 更多