更改表中聚簇索引主键的数据类型

时间:2014-11-07 14:41:43

标签: sql sql-server alter

我有一张表

 CONSTRAINT [user_const] PRIMARY KEY CLUSTERED ([id] ASC, [group] ASC)

我想将组的数据类型从NCHAR更改为NVARCHAR。

简单地运行

ALTER TABLE [dbo].[user] ALTER COLUMN [group] NVARCHAR (50) NOT NULL;

给了我一个错误:

  

对象'us​​er_const'依赖于列'group'。

CHECK NOCHECK无效

  

此操作仅适用于外键和检查约束。

所以,我认为我应该删除约束并重新创建它

ALTER TABLE [dbo].[user] DROP CONSTRAINT [user_const];
ALTER TABLE [dbo].[user] ALTER COLUMN [group] NVARCHAR (50) NOT NULL;
ALTER TABLE [dbo].[user] ADD CONSTRAINT CONSTRAINT [user_const] PRIMARY KEY CLUSTERED ([id] ASC, [group] ASC)

但是错误读取

  

此版本的SQL Server不支持没有聚簇索引的表。

如何更改作为主键约束的列的数据类型?

2 个答案:

答案 0 :(得分:0)

Azure不支持没有聚簇索引的表。在这里阅读

http://msdn.microsoft.com/library/azure/ee336245.aspx#cir

为了更改数据类型,您将不得不使用新数据类型创建第二个表,移动数据,然后重命名。

答案 1 :(得分:0)

由于您正在更改主键,因此您无论如何都在有效地重建整个表,因此您也可以使用新格式构建新表并重命名以使名称正确。我没有运行这个,所以它可能需要一些调整,但是这样的事情:

-- check to see if we've already run this script and swap table names and just run it again with the old data if we have
IF EXISTS (SELECT * FROM SysObjects WHERE name='MyTable_bak' AND type='U')
    IF EXISTS (SELECT * FROM SysObjects WHERE name='MyTable' AND type='U')
        DROP TABLE MyTable
    ELSE
        EXEC sp_rename 'MyTable', 'MyTable_bak'
GO

-- create the new table with updated columns
CREATE TABLE MyTable (
    [id] BIGINT NOT NULL,
    [group] NVARCHAR(50) NOT NULL,
CONSTRAINT PK_MyTable PRIMARY KEY CLUSTERED
(
    [id] ASC, [group] ASC
))
GO

-- copy in the data from the old version
INSERT MyTable([id],[group])
SELECT [id],[group] 
FROM MyTable_bak
GO

-- drop the old table (maybe wait to do this until testing is complete?)
DROP TABLE MyTable_bak