একটি যৌগিক প্রাথমিক কী যুক্ত করতে টেবিলটি পরিবর্তন করুন


195

আমার কাছে একটি টেবিল আছে provider। আমি তিনটি কলাম নামের person, place, thing। সদৃশ ব্যক্তি, সদৃশ স্থান এবং সদৃশ জিনিস থাকতে পারে তবে কোনও দ্বৈত ব্যক্তি-স্থান-জিনিসের সংমিশ্রণ কখনও হতে পারে না।

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

উত্তর:


424
ALTER TABLE provider ADD PRIMARY KEY(person,place,thing);

যদি একটি প্রাথমিক কী ইতিমধ্যে বিদ্যমান থাকে তবে আপনি এটি করতে চান

ALTER TABLE provider DROP PRIMARY KEY, ADD PRIMARY KEY(person, place, thing);

17
@ ডেভিড 542 এটি নয় - আপনার কাছে কেবলমাত্র 1 টি প্রাথমিক কী থাকতে পারে।
অ্যাড্রিয়ান কর্নিশ

35
@ ডেভিড: এটি একাধিক ক্ষেত্র সমন্বিত একক প্রাথমিক কী, একটি যৌথ কী।
মার্ক বি

3
@ ডেভিড 542 অবশ্যই আপনি এটি করতে পারেন - এটি একটি সমন্বিত প্রাথমিক কী যা 3 টি ক্ষেত্র সমন্বিত। 3 টি ক্ষেত্রের সংমিশ্রণটি অবশ্যই অনন্য।
অ্যাড্রিয়ান কর্নিশ

2
পোস্ট করার জন্য ধন্যবাদ - সত্যই আমাকে
ইউআইয়ের

1
এসও এর সবচেয়ে মূল্যবান উত্তরগুলির মধ্যে একটি :)
alwbtc

21

@ অ্যাড্রিয়ান কর্নিশের উত্তরটি সঠিক। তবে বিদ্যমান প্রাথমিক কী বাদ দেওয়ার জন্য আরও একটি সতর্কতা রয়েছে। যদি সেই প্রাথমিক কীটি অন্য টেবিলের সাহায্যে বিদেশী কী হিসাবে ব্যবহৃত হয় তবে এটিকে ফেলে দেওয়ার চেষ্টা করার সময় আপনি একটি ত্রুটি পাবেন। মাইএসকিএল-এর কয়েকটি সংস্করণে ত্রুটি বার্তাটি বিকৃত ছিল (5.5.17 হিসাবে, এই ত্রুটি বার্তাটি এখনও রয়েছে is

alter table parent  drop column id;
ERROR 1025 (HY000): Error on rename of
'./test/#sql-a04_b' to './test/parent' (errno: 150).

যদি আপনি এমন একটি প্রাথমিক কী বাদ দিতে চান যা অন্য টেবিলের দ্বারা উল্লেখ করা হয় তবে আপনাকে প্রথমে অন্য টেবিলের মধ্যে বিদেশী কীটি ফেলে দিতে হবে। আপনি প্রাথমিক কীটি পুনরায় তৈরি করার পরেও যদি আপনি এটি চান তবে আপনি এই বিদেশী কীটি পুনরায় তৈরি করতে পারেন।

এছাড়াও, যৌগিক কীগুলি ব্যবহার করার সময়, ক্রমটি গুরুত্বপূর্ণ। এইগুলো

1) ALTER TABLE provider ADD PRIMARY KEY(person,place,thing);
and
2) ALTER TABLE provider ADD PRIMARY KEY(person,thing,place);

একই জিনিস নয়। তারা উভয়ই তিনটি ক্ষেত্রের সেটে স্বতন্ত্রতা প্রয়োগ করে, তবে সূচকের দিক থেকে একটি পার্থক্য রয়েছে। ক্ষেত্রগুলি বাম থেকে ডানে সূচিযুক্ত। উদাহরণস্বরূপ, নিম্নলিখিত প্রশ্নগুলি বিবেচনা করুন:

A) SELECT person, place, thing FROM provider WHERE person = 'foo' AND thing = 'bar';
B) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz';
C) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz' AND thing = 'bar';
D) SELECT person, place, thing FROM provider WHERE place = 'baz' AND thing = 'bar';

বি ALTER স্টেটমেন্টে
প্রাথমিক কী সূচকটি ব্যবহার করতে পারে 1 এ প্রাথমিক বিবরণীতে প্রাথমিক কী সূচক
ব্যবহার করতে পারে 2 সি সূচক
ডি ব্যবহার করতে পারে না সূচক ব্যবহার করতে পারে না

একটি আংশিক সূচক হিসাবে সূচক 2-এ প্রথম দুটি ক্ষেত্র ব্যবহার করে। একটি সূচক 1 ব্যবহার করতে পারে না কারণ এটি সূচকের মধ্যবর্তী স্থান অংশটি জানে না। এটি এখনও সঠিক ব্যক্তির উপর আংশিক সূচক ব্যবহার করতে সক্ষম হতে পারে।

ডি কোনওটি সূচক ব্যবহার করতে পারে না কারণ এটি ব্যক্তি জানে না।

আরও তথ্যের জন্য এখানে mysql ডক্স দেখুন ।


@ সমস্ত - আপনি দয়া করে এর জন্য জেপিএ সমতুল্য ভাগ করে নিতে পারেন?
প্র_এ

17

আপনি কেবল একটি অনন্য কনসার্ট চাইবেন। বিশেষত আপনার যদি ইতিমধ্যে একটি সারোগেট কী থাকে। (ইতিমধ্যে বিদ্যমান সারোগেট কী এর উদাহরণটি একটি একক কলাম হবে যা একটি স্বতঃসূচী হয়)

নীচে একটি অনন্য বাধা জন্য বর্গ কোড আছে

ALTER TABLE `MyDatabase`.`Provider`
    ADD CONSTRAINT CK_Per_Place_Thing_Unique UNIQUE (person,place,thing)
;

আপনাকে ধন্যবাদ, একটি সীমাবদ্ধতা হ'ল আমি যা চাইছিলাম, আমি এই প্রাথমিক পোস্টে কী জিজ্ঞাসা করব তা আমি জানতাম না। এটি থ্রেডে যুক্ত করার জন্য ধন্যবাদ।
ZaneDarken

আমি সাধারণত একটি সারোগেট কী ব্যবহার করি ...... তারপরে একটি অনন্য সীমাবদ্ধতা যুক্ত করুন। এইভাবে .... যদি "স্বতন্ত্রতা" রাস্তায় নেমে আসে, তবে প্রাথমিক-কীটির সাথে জগাখিচুড়ি করা বাধা মুছে ফেলা খুব বেশি নাটক নয়। এবং যদি আপনার চাইল্ড টেবিলগুলি থাকে যা বিদেশী-কীটি এই টেবিলটিকে উল্লেখ করে, আপনার কেবলমাত্র সার্গেট-কী এফকে করতে হবে, সমস্ত 3 টি কলাম নয়। -
গ্রানাডা কোডার


1

@ গ্রানাডা কোডার অফার হিসাবে কমপোসিট ইউনিক কিকে ব্যবহার করা অবশ্যই আরও ভাল though

ALTER IGNORE TABLE table_name ADD UNIQUES INDEX idx_name(some_id, another_id, one_more_id);


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