我有一张表
CONSTRAINT [user_const] PRIMARY KEY CLUSTERED ([id] ASC, [group] ASC)
我想将组的数据类型从NCHAR更改为NVARCHAR。
简单地运行
ALTER TABLE [dbo].[user] ALTER COLUMN [group] NVARCHAR (50) NOT NULL;
给了我一个错误:
对象'user_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不支持没有聚簇索引的表。
如何更改作为主键约束的列的数据类型?
答案 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