primary-key – 如何更改SQL Azure上的现有主键?

前端之家收集整理的这篇文章主要介绍了primary-key – 如何更改SQL Azure上的现有主键?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想修改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';

sp_rename方法存在一些问题,最重要的是在重命名期间表的权限不会延续,以及外键约束.

原文链接:https://www.f2er.com/mssql/79667.html

猜你在找的MsSQL相关文章