我想修改sql Azure表上的现有主键.
它目前有一列,我想添加另一列.
它目前有一列,我想添加另一列.
现在,在sql Server 2008上,这只是一块蛋糕,只是在SSMS,poof中做到了.完成.
如果我从sql Server编写脚本,这就是PK的样子:
ALTER TABLE [dbo].[Friend] ADD CONSTRAINT [PK_Friend] PRIMARY KEY CLUSTERED ( [UserId] ASC,[Id] ASC )
但是,在sql Azure上,当我尝试执行上述操作时,它当然会失败:
表’朋友’已经在其上定义了主键.
很好,所以我试着放下钥匙:
此版本的sql Server不支持没有聚簇索引的表.请创建聚簇索引,然后重试.
好的,所以我尝试创建一个临时聚集索引以删除PK:
CREATE CLUSTERED INDEX IX_Test ON [Friend] ([UserId],[Id])
结果如下:
无法在表’Friend’上创建多个聚簇索引.在创建另一个之前删除现有的聚簇索引“PK_Friend”.
很棒,一个抓住时刻.
如何将UserId列添加到现有PK?
解决方法
注意:从Azure sql数据库v12开始,这些限制不再适用.
这不是“主要指数”.存在诸如“主键”之类的东西,并且还存在诸如“聚集索引”之类的东西.不同的概念,经常混淆.考虑到这一区别,让我们重温一下这个问题:
Q1)是否可以修改sql Azure表中的聚簇索引?
答:是的.使用WITH(DROP_EXISTING = ON):
create table Friend ( UserId int not null,Id int not null); go create clustered index cdxFriend on Friend (UserId,Id); go create clustered index cdxFriend on Friend (Id,UserId) with (drop_existing=on); go
Q2)是否可以修改具有主键约束的表的聚簇索引?
答:是的,与上面相同,只要未通过聚集索引强制执行主键约束:
create table Friend ( UserId int not null,Id int not null identity(1,1),constraint pk_Friend primary key nonclustered (Id)); create clustered index cdxFriend on Friend (UserId,UserId) with (drop_existing=on); go
Q3)可以修改表的主键约束吗?
答:可以,只要未通过聚簇索引强制执行主要约束:
create table Friend ( UserId int not null,constraint pk_Friend primary key nonclustered (Id)); go create clustered index cdxFriend on Friend (UserId,Id); go alter table Friend drop constraint pk_Friend; alter table Friend add constraint pk_Friend primary key nonclustered (UserId) go
Q4)通过聚簇索引强制执行时,是否可以修改表的主键?
答:是的,如果表中没有任何行:
create table Friend ( UserId int not null,constraint pk_Friend primary key clustered (UserId,Id)); go alter table Friend drop constraint pk_Friend; alter table Friend add constraint pk_Friend primary key clustered (Id,UserId) go
Q5)如果填充表,是否可以通过聚簇索引强制修改表的主键?
答:不会.任何将填充的聚簇索引转换为堆的操作都将在sql Azure中被阻止,即使该表为空:
create table Friend ( UserId int not null,Id)); go insert into Friend (UserId) values (1); delete from Friend; go alter table Friend drop constraint pk_Friend;
作为旁注:如果表被截断,则可以修改约束.
更改填充表的PK约束的解决方法是执行旧的sp_rename
技巧:
create table Friend ( UserId int not null,Id)); go insert into Friend (UserId) values (1); go create table FriendNew ( UserId int not null,constraint pk_Friend_New primary key clustered (Id,UserId)); go set identity_insert FriendNew on; insert into FriendNew (UserId,Id) select UserId,Id from Friend; set identity_insert FriendNew off; go begin transaction exec sp_rename 'Friend','FriendOld'; exec sp_rename 'FriendNew','Friend'; commit; go sp_help 'Friend';