gpt4 book ai didi

sql - azure db 删除 pk 并添加一个新的

转载 作者:行者123 更新时间:2023-12-02 20:12:06 24 4
gpt4 key购买 nike

我在 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 他们最终放弃了 table 并创建了一个新 table - 这不可能是唯一的方法,这太愚蠢了。

最佳答案

复制 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 方法存在一些问题,最重要的是表上的权限以及外键约束在重命名期间不会保留。

关于sql - azure db 删除 pk 并添加一个新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26968806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com