我在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 他们最终放弃了桌子并创建了一张新桌子 - 这绝不是唯一的方法,这只是愚蠢。
答案 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上有可能!