কীভাবে আমি এসকিউএল অ্যাজুরে একটি বিদ্যমান প্রাথমিক কী পরিবর্তন করতে পারি?


25

আমি একটি এসকিউএল আজুর টেবিলের একটি বিদ্যমান প্রাথমিক কীটি সংশোধন করতে চাই।
বর্তমানে এটির একটি কলাম রয়েছে এবং আমি অন্যটি যুক্ত করতে চাই।

এখন, এসকিউএল সার্ভার ২০০৮ এ এটি পিষ্টের এক টুকরো ছিল, এসএসএমএস-এ এটি করা হয়েছিল সম্পন্ন. এসকিউএল সার্ভার থেকে যদি স্ক্রিপ্ট করি তবে পিকে এটির মতো দেখাচ্ছে:

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

যাইহোক, এসকিউএল অ্যাজুরে যখন আমি উপরেরটি সম্পাদন করার চেষ্টা করি তখন অবশ্যই এটি ব্যর্থ হবে:

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 মুহুর্ত।

কীভাবে আমি আমার বিদ্যমান পিকেতে ইউজারআইডি কলাম যুক্ত করব?


উত্তর:


34

দ্রষ্টব্য: আজুর এসকিউএল ডেটাবেস ভি 12 হিসাবে, এই বিধিনিষেধগুলি আর প্রয়োগ হয় না।

এটি 'প্রাথমিক সূচক' বলে কোনও বিষয় নয়। একটি 'প্রাথমিক কী' এর মতো জিনিস আছে এবং 'ক্লাস্টারড ইনডেক্স' এর মতো জিনিসও রয়েছে। স্বতন্ত্র ধারণা, প্রায়শই বিভ্রান্ত হয়। এই পার্থক্যটি মাথায় রেখে, প্রশ্নটি আবার দেখা যাক:

প্রশ্ন 1) এসকিউএল অ্যাজুরি টেবিলের ক্লাস্টারড ইনডেক্সটি কি সংশোধন করা যেতে পারে?
উত্তর: হ্যাঁ ব্যবহার 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

প্রশ্ন 2) প্রাথমিক কী বাধা আছে এমন একটি টেবিলের ক্লাস্টারড ইনডেক্সটি কি সংশোধন করা যেতে পারে?
উত্তর: হ্যাঁ, উপরের মত একই, যতক্ষণ না ক্লাস্টারড সূচকের মাধ্যমে প্রাথমিক কী বাধা প্রয়োগ করা হয় না:

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

প্রশ্ন 3) কোনও টেবিলের প্রাথমিক কী বাধা পরিবর্তন করা যেতে পারে?
উত্তর: হ্যাঁ, যতক্ষণ না ক্লাস্টারড সূচকের মাধ্যমে প্রাথমিক সীমাবদ্ধতা প্রয়োগ করা হয় না:

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

প্রশ্ন 4) ক্লাস্টারড ইনডেক্সের মাধ্যমে প্রয়োগ করা হলে কোনও টেবিলের প্রাথমিক কীটি সংশোধন করা যেতে পারে?
উত্তর: হ্যাঁ, যদি টেবিলে কোনও সারি না থাকে:

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

প্রশ্ন 5) টেবিলটি জনবসতিযুক্ত হলে ক্লাস্টারড ইনডেক্সের মাধ্যমে প্রয়োগ করা হলে কোনও টেবিলের প্রাথমিক কীটি সংশোধন করা যেতে পারে?
উত্তর: না Any একটি জনবহুল ক্লাস্টারড সূচককে একটি গাদা হিসাবে রূপান্তর করে এমন কোনও অপারেশন এসকিউএল অ্যাজুরেতে অবরুদ্ধ করা হবে, সারণীটি খালি থাকলেও :

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 কৌশলটি করেছে, যদিও আমার আইডি কোনও পরিচয় কলাম নয়।
ম্যাগনাস

sp_rename workaround সহায়ক ছিল!
জাস্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.