Sau khi khám phá ra, tôi tốt hơn nên thay đổi các khóa chính từ không phân cụm thành phân cụm. Cf câu hỏi này về các chỉ mục được nhóm trên các cột danh tính , bước tiếp theo là làm thế nào để làm điều này theo cách prcatical.
Tôi đã rất ngạc nhiên khi tôi không tìm thấy câu hỏi này trên SO.
Có các tham chiếu tham chiếu giữa các bảng của tôi, tôi không thể đơn giản làm
if object_id('MyChild') > 0 drop table MyChild
if object_id('Mytable') > 0 drop table Mytable
create table Mytable(
id int Not NULL
)
go
create table MyChild(
id int Not NULL,
masterid int NULL
)
go
alter table Mytable add constraint PK_Mytable primary key (id)
alter table MyChild add constraint FK_MyChild_MyTable foreign key (masterid) references Mytable(id)
go
-- Now I want to change the primary key into a clustered primary key
-- this throws an error
ALTER TABLE Mytable DROP CONSTRAINT PK_Mytable
GO
ALTER TABLE Mytable ADD CONSTRAINT PK_Mytable PRIMARY KEY CLUSTERED (id)
GO
Ở đây tôi nhận được lỗi sau
Msg 3725, Level 16, State 0, Line 1
Auf die 'PK_Mytable'-Einschränkung wird von der 'MyChild'-Tabelle, FOREIGN KEY-Einschränkung 'FK_MyChild_MyTable' verwiesen.
Msg 3727, Level 16, State 0, Line 1
Die Einschränkung konnte nicht gelöscht werden. Siehe vorherige Fehler.
OK Tôi biết rằng nó hoạt động, khi tôi bỏ ràng buộc khóa ngoại trước khi thay đổi và thiết lập lại sau đó.
alter table MyChild drop constraint FK_MyChild_MyTable
go
ALTER TABLE Mytable DROP CONSTRAINT PK_Mytable
GO
ALTER TABLE Mytable ADD CONSTRAINT PK_Mytable PRIMARY KEY CLUSTERED (id)
GO
alter table MyChild add constraint FK_MyChild_MyTable foreign key (masterid) references Mytable(id)
go
Nghe có vẻ như, tôi phải kịch bản tất cả các quan hệ khóa ngoài từ cơ sở dữ liệu, loại bỏ chúng, thực hiện các thay đổi khóa chính của tôi và thiết lập lại các khóa ngoại từ tập lệnh được tạo.
Có cách nào tốt hơn cho nhiệm vụ này.
BTW. Cuối cùng chúng tôi muốn làm điều này trên cơ sở dữ liệu sản xuất. (Thời gian chết là một lựa chọn được phép). Tất cả các cơ sở dữ liệu là SQL Server 2005 hoặc SQL Server 2008.
Biên tập:
Một đồng nghiệp đã đề xuất bỏ tất cả các chỉ mục trước hoạt động này và xây dựng lại chúng sau đó. Âm thanh hợp lý với tôi.
2. Chỉnh sửa:
Nhìn vào câu hỏi dba.stackexchange này , tôi bắt đầu tự hỏi liệu nó có đủ để chỉ thêm các chỉ mục được nhóm vào các cột khóa chính của bảng không.