azure db drop pk并添加一个新的

时间:2014-11-17 08:53:14

标签: sql sql-server azure azure-sql-database

我在Azure上有MS SQL数据库,我想删除我的主键约束并添加另一列作为主键,每次我尝试运行脚本删除主键时我都会收到错误:

"此版本的SQL Server不支持没有聚簇索引的表。请创建聚集索引并重试。"

运行此脚本:

IF EXISTS (SELECT * FROM sys.key_constraints WHERE type = 'PK' AND parent_object_id = OBJECT_ID('dbo.Paypaltransaction') AND Name = 'PK_PaypalTransaction')
   ALTER TABLE dbo.PaypalTransaction
   DROP CONSTRAINT PK_PaypalTransaction
GO

然后我去尝试创建另一个主键:

-- add new primary key constraint on new column   
ALTER TABLE dbo.PaypalTransaction 
ADD CONSTRAINT PK_PaypalTransactionId
PRIMARY KEY CLUSTERED (PaypalTransactionId)
GO

我收到此错误: "表' PaypalTransaction'已经在其上定义了主键。"

我理解错误,但我无法删除主键,因为它显然必须有一个,而我无法添加新主键,因为我已经有了一个。我是永远陷入永远,永远和错误的列作为我的主键:'(

我看到This Question here that is the same 他们最终放弃了桌子并创建了一张新桌子 - 这绝不是唯一的方法,这只是愚蠢。

2 个答案:

答案 0 :(得分:4)

从DBA.Se回复:

Q5)如果填充表格,是否可以通过聚集索引强制修改表的主键?
答:不会。任何将填充的聚簇索引转换为堆的操作都将在SQL Azure中被阻止,即使表是空的

create table Friend (
    UserId int not null,
    Id int not null identity(1,1),
    constraint pk_Friend primary key clustered (UserId, 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 int not null identity(1,1),
    constraint pk_Friend primary key clustered (UserId, Id));
go
insert into Friend (UserId) values (1);
go

create table FriendNew (
    UserId int not null,
    Id int not null identity(1,1),
    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方法存在一些问题,最重要的是桌面上的权限在重命名期间不会延续,以及外键约束。

答案 1 :(得分:1)

我刚刚测试过,似乎在SQL AZURE V12上有可能!