Lưu ý: kể từ Azure SQL Database v12, những hạn chế này không còn được áp dụng.
Đây không phải là một "chỉ số chính". Có một thứ gọi là 'khóa chính' và cũng có một thứ gọi là 'chỉ số cụm'. Khái niệm khác biệt, thường bị nhầm lẫn. Với sự khác biệt này trong tâm trí, hãy xem xét lại câu hỏi:
Q1) Chỉ mục cụm trong bảng SQL Azure có thể được sửa đổi không?
A: Vâng. Sử dụng 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
Câu 2) Có thể sửa đổi chỉ mục cụm của bảng có ràng buộc khóa chính không?
Trả lời: Có, giống như trên, miễn là ràng buộc khóa chính không được thi hành thông qua chỉ mục được nhóm:
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, Id);
go
create clustered index cdxFriend on Friend (Id, UserId) with (drop_existing=on);
go
Câu 3) Có thể sửa đổi ràng buộc khóa chính của bảng không?
Trả lời: Có, miễn là ràng buộc chính không được thi hành thông qua chỉ mục được nhóm:
create table Friend (
UserId int not null,
Id int not null identity(1,1),
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
Câu hỏi 4) Khóa chính của bảng có thể được sửa đổi khi được thi hành thông qua chỉ mục được nhóm không?
A: Có, nếu bảng không bao giờ có bất kỳ hàng nào:
create table Friend (
UserId int not null,
Id int not null identity(1,1),
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
Câu 5) Khóa chính của bảng có thể được sửa đổi khi được thi hành thông qua chỉ mục được nhóm nếu bảng được điền không?
Trả lời: Không. Bất kỳ thao tác nào chuyển đổi một chỉ mục được nhóm thành dân số thành một đống sẽ bị chặn trong SQL Azure, ngay cả khi bảng trống :
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;
Như một lưu ý phụ: ràng buộc có thể được sửa đổi nếu bảng bị cắt ngắn .
Cách giải quyết để thay đổi ràng buộc PK của bảng dân cư là thực hiện sp_rename
thủ thuật cũ tốt :
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';
Cách sp_rename
tiếp cận có một số vấn đề, quan trọng nhất là các quyền trên bảng không được thực hiện trong quá trình đổi tên, cũng như các ràng buộc khóa ngoài.