मैं SQL Azure पर मौजूदा प्राथमिक कुंजी को कैसे बदल सकता हूँ?


25

मैं SQL Azure टेबल पर मौजूदा प्राथमिक कुंजी को संशोधित करना चाहता हूं।
वर्तमान में इसका एक कॉलम है, और मैं एक और जोड़ना चाहता हूं।

अब, SQL Server 2008 पर यह केक का एक टुकड़ा था, बस SSMS, पूफ ​​में किया। किया हुआ। यदि यह SQL सर्वर से स्क्रिप्ट करता है तो पीके कैसा दिखता है:

ALTER TABLE [dbo].[Friend] ADD  CONSTRAINT [PK_Friend] PRIMARY KEY CLUSTERED 
(
  [UserId] ASC,
  [Id] ASC
)

हालाँकि, SQL Azure पर, जब मैं उपरोक्त निष्पादित करने का प्रयास करता हूं, तो यह निश्चित रूप से विफल हो जाएगा:

Table 'Friend' already has a primary key defined on it.

ठीक है, इसलिए मैं कुंजी को छोड़ने की कोशिश करता हूं:

Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again.

ठीक है, इसलिए मैं पीके को छोड़ने के लिए एक अस्थायी क्लस्टर इंडेक्स बनाने की कोशिश करता हूं:

CREATE CLUSTERED INDEX IX_Test ON [Friend] ([UserId],[Id])

जिसके परिणामस्वरूप: Cannot create more than one clustered index on table 'Friend'. Drop the existing clustered index 'PK_Friend' before creating another.

शानदार, एक कैच 22 पल।

मैं अपने मौजूदा PK में UserId कॉलम कैसे जोड़ूं?


जवाबों:


34

नोट: Azure SQL डेटाबेस v12 के रूप में, ये प्रतिबंध अब लागू नहीं होते हैं।

'प्राथमिक सूचकांक' जैसी कोई चीज नहीं है। Key प्राइमरी की ’जैसी कोई चीज होती है और ered क्लस्टर इंडेक्स’ जैसी कोई चीज भी होती है। विकृत अवधारणाएं, अक्सर भ्रमित होती हैं। इस अंतर को ध्यान में रखते हुए, प्रश्न को फिर से देखें:

Q1) SQL Azure टेबल में क्लस्टर किए गए इंडेक्स को संशोधित किया जा सकता है?
A: हाँ। उपयोग करें 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

Q2) क्या एक प्राथमिक कुंजी बाधा वाली तालिका का क्लस्टर इंडेक्स संशोधित किया जा सकता है?
एक: हाँ, ऊपर के रूप में ही, जब तक प्राथमिक कुंजी बाधा क्लस्टर सूचकांक के माध्यम से लागू नहीं किया जाता है:

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

Q3) क्या किसी तालिका के प्राथमिक प्रमुख अवरोध को संशोधित किया जा सकता है?
एक: हाँ, जब तक कि प्राथमिक अवरोध क्लस्टर के माध्यम से लागू नहीं किया जाता है:

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

Q4) क्या तालिका की प्राथमिक कुंजी को संशोधित सूचकांक के माध्यम से लागू किए जाने पर संशोधित किया जा सकता है?
एक: हाँ, अगर तालिका में कभी कोई पंक्तियाँ नहीं थीं:

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

Q5) क्या तालिका के प्राथमिक कुंजी को संशोधित किया जा सकता है, जब तालिका पॉप्युलेट होने पर क्लस्टर इंडेक्स के माध्यम से लागू किया जाता है?
A: नहीं। कोई भी ऑपरेशन जो पॉप्युलेट किए गए क्लस्टर इंडेक्स को हीप में परिवर्तित करता है, वह 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;

एक साइड नोट के रूप में: यदि टेबल को काट दिया जाता है, तो बाधा को संशोधित किया जा सकता है ।

पॉपुलेटेड टेबल के पीके अड़चन को बदलने के लिए अच्छी पुरानी 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दृष्टिकोण सबसे महत्वपूर्ण बात यह है कि मेज पर अनुमतियाँ नाम बदलने के साथ-साथ विदेशी कुंजी की कमी के दौरान आपके साथ नहीं है, कुछ मुद्दे हैं।


A1-A4 मेरे मामले में कोई जवाब नहीं हैं। A5 ने चाल चली, हालाँकि मेरा Id कोई पहचान स्तंभ नहीं है।
मैग्नस

मददगार था!
जस्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.