এসকিউএল সার্ভারের কোনও অনন্য সূচক এবং একটি প্রাথমিক কী এর মধ্যে নির্বাচনের কোনও পদ্ধতি আছে?
বিদেশী কী তৈরি করা হচ্ছে এবং বিকল্প কী বাধা বা অনন্য সূচকগুলি রেফার করার সময় টেবিলে উপস্থিত থাকলে, কমপক্ষে স্কেলসার্ভারকে প্রাথমিক কীটি উল্লেখ করার পক্ষে নির্দেশ দেওয়া সম্ভব।
প্রাথমিক কীটি যদি রেফারেন্স করা প্রয়োজন, তবে কেবলমাত্র সারণীর নাম উল্লেখ করা উচিত বিদেশী কী সংজ্ঞাতে এবং উল্লেখ করা কলামগুলির তালিকা বাদ দেওয়া উচিত:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentID)
-- omit key columns of the referenced table
REFERENCES Parent /*(ParentID)*/;
নীচে আরও বিশদ।
নিম্নলিখিত সেটআপ বিবেচনা করুন:
CREATE TABLE T (id int NOT NULL, a int, b int, c uniqueidentifier, filler binary(1000));
CREATE TABLE TRef (tid int NULL);
যেখানে টেবিলটি TRef
রেফারেন্স সারণিতে মনস্থ করে T
।
রেফারেন্সিয়াল সীমাবদ্ধতা তৈরি করতে কেউ ALTER TABLE
দুটি বিকল্পের সাহায্যে কমান্ড ব্যবহার করতে পারে :
ALTER TABLE TRef
ADD CONSTRAINT FK_TRef_T_1 FOREIGN KEY (tid) REFERENCES T (id);
ALTER TABLE TRef
ADD CONSTRAINT FK_TRef_T_2 FOREIGN KEY (tid) REFERENCES T;
লক্ষ্য করুন যে দ্বিতীয় ক্ষেত্রে সারণীর কোনও কলাম উল্লেখ করা হয়নি ( REFERENCES T
বনাম REFERENCES T (id)
)।
যেহেতু T
এখনও কোনও কী সূচি নেই, এই আদেশগুলি কার্যকর করা ত্রুটি তৈরি করবে।
প্রথম কমান্ড নিম্নলিখিত ত্রুটি প্রদান করে:
এমএসজি 1776, স্তর 16, রাজ্য 0, লাইন 4
রেফারেন্সিং সারণী 'টি' তে এমন কোনও প্রাথমিক বা প্রার্থী কী নেই যা বিদেশী কী 'FK_TRef_T_1' তে রেফারেন্সিং কলাম তালিকার সাথে মেলে।
দ্বিতীয় কমান্ড, যদিও বিভিন্ন ত্রুটি প্রদান করে:
এমএসজি 1773, স্তর 16, রাজ্য 0, লাইন 4
বিদেশী কী 'FK_TRef_T_2' অবজেক্ট 'টি' তে অন্তর্নিহিত রেফারেন্স রয়েছে যা এতে কোনও প্রাথমিক কী সংজ্ঞায়িত করে না।
দেখুন প্রথম ক্ষেত্রে প্রত্যাশাটি প্রাথমিক বা প্রার্থী কীগুলি , তবে দ্বিতীয় ক্ষেত্রে প্রত্যাশা কেবল প্রাথমিক কী ।
এসকিএলএস সার্ভার দ্বিতীয় কমান্ডের সাহায্যে প্রাথমিক কী ছাড়া অন্য কিছু ব্যবহার করবে কিনা তা পরীক্ষা করে দেখা যাক।
যদি আমরা কিছু অনন্য সূচি এবং অনন্য কী যুক্ত করি T
:
CREATE UNIQUE INDEX IX_T_1 on T(id) INCLUDE (filler);
CREATE UNIQUE INDEX IX_T_2 on T(id) INCLUDE (c);
CREATE UNIQUE INDEX IX_T_3 ON T(id) INCLUDE (a, b);
ALTER TABLE T
ADD CONSTRAINT UQ_T UNIQUE CLUSTERED (id);
FK_TRef_T_1
সৃষ্টির জন্য কমান্ড সাফল্য পেয়েছে, তবে FK_TRef_T_2
এখনও তৈরির আদেশটি এমএসজি 1773 এর সাথে ব্যর্থ হয়।
অবশেষে, আমরা যদি প্রাথমিক কী যুক্ত করি তবে T
:
ALTER TABLE T
ADD CONSTRAINT PK_T PRIMARY KEY NONCLUSTERED (id);
FK_TRef_T_2
সৃষ্টির জন্য আদেশ সফল হয়েছে eds
আসুন টেবিলে T
বিদেশী কী দ্বারা সারণীর সূচীগুলি কী তা উল্লেখ করা হয় তা দেখুন TRef
:
select
ix.index_id,
ix.name as index_name,
ix.type_desc as index_type_desc,
fk.name as fk_name
from sys.indexes ix
left join sys.foreign_keys fk on
fk.referenced_object_id = ix.object_id
and fk.key_index_id = ix.index_id
and fk.parent_object_id = object_id('TRef')
where ix.object_id = object_id('T');
এটি ফিরে আসে:
index_id index_name index_type_desc fk_name
--------- ----------- ----------------- ------------
1 UQ_T CLUSTERED NULL
2 IX_T_1 NONCLUSTERED FK_TRef_T_1
3 IX_T_2 NONCLUSTERED NULL
4 IX_T_3 NONCLUSTERED NULL
5 PK_T NONCLUSTERED FK_TRef_T_2
দেখতে FK_TRef_T_2
মিলা PK_T
।
সুতরাং, হ্যাঁ, REFERENCES T
সিনট্যাক্সের সাথে বিদেশী কী এর TRef
প্রাথমিক কীতে ম্যাপ করা হয়েছে T
।
আমি স্কেল সার্ভার ডকুমেন্টেশনে সরাসরি বর্ণিত এ জাতীয় আচরণ খুঁজে পাইনি, তবে উত্সর্গীকৃত এমএসজি 1773 পরামর্শ দেয় যে এটি দুর্ঘটনাক্রমে নয়। সম্ভবত এ জাতীয় বাস্তবায়ন এসকিউএল স্ট্যান্ডার্ডের সাথে সম্মতি সরবরাহ করে, নীচে এএনএসআই / আইএসও 9075-2: 2003 এর ১১.৮ ধারা থেকে সংক্ষিপ্ত অংশ
11 স্কিমার সংজ্ঞা এবং কারসাজি
11.8 <রেফারেন্সিয়াল সীমাবদ্ধতার সংজ্ঞা>
ফাংশন
একটি রেফারেন্সিয়াল সীমাবদ্ধতা নির্দিষ্ট করে।
বিন্যাস
<referential constraint definition> ::=
FOREIGN KEY <left paren> <referencing columns> <right paren>
<references specification>
<references specification> ::=
REFERENCES <referenced table and columns>
[ MATCH <match type> ]
[ <referential triggered action> ]
...
সিনট্যাক্স বিধি
...
3) কেস:
...
খ) যদি <রেফারেন্সেড টেবিল এবং কলামগুলি <একটি রেফারেন্স কলাম তালিকা> নির্দিষ্ট করে না, তবে রেফারেন্সযুক্ত সারণির টেবিল বর্ণনাকারীতে একটি অনন্য বাধা অন্তর্ভুক্ত করা হবে যা প্রাথমিক কী নির্দিষ্ট করে। যাক রেফারেন্সড কলাম কলাম বা যে অনন্য বাধ্যতা অনন্য কলাম দ্বারা চিহ্নিত কলাম হতে হবে এবং দিন রেফারেন্সড কলাম
এক ধরনের কলাম হতে। <রেফারেন্স সারণী এবং কলামগুলি> স্পষ্টভাবে একটি <রেফারেন্স কলাম তালিকা> যা << অনন্য কলাম তালিকার অনুরূপ> নির্দিষ্ট করে বিবেচিত হবে।
...
লেনদেন-এসকিউএল এএনএসআই এসকিউএল সমর্থন করে এবং প্রসারিত করে। এটি ঠিক তবে এসকিউএল স্ট্যান্ডার্ডের সাথে খাপ খায় না। এসকিউএল সার্ভার লেনদেন-এসকিউএল আইএসও / আইসিআই 9075-2 স্ট্যান্ডার্ডস সাপোর্ট ডকুমেন্ট (সংক্ষেপে এমএস-টিএসকিউএসআইএলআইএসও ২2, এখানে দেখুন ) নামক একটি নথি রয়েছে যা ট্রানজ্যাক্ট-এসকিউএল দ্বারা সরবরাহিত সহায়তার স্তর বর্ণনা করে। দস্তাবেজটি স্ট্যান্ডার্ডে এক্সটেনশন এবং প্রকরণগুলি তালিকাভুক্ত করে। উদাহরণস্বরূপ এটি দলিল করে যে MATCH
রেফারেন্সিয়াল সীমাবদ্ধতার সংজ্ঞাতে ধারাটি সমর্থন করে না। তবে স্ট্যান্ডার্ড টুকরাটির সাথে সম্পর্কিত কোনও ডকুমেন্টেড ভিন্নতা নেই। সুতরাং, আমার মতে পর্যবেক্ষণ করা আচরণ যথেষ্ট নথিভুক্ত।
এবং REFERENCES T (<reference column list>)
সিনট্যাক্সের ব্যবহারের সাথে মনে হয় যে স্কেল সার্ভারটি উল্লেখযোগ্য টেবিলের সূচকের মধ্যে প্রথম উপযুক্ত নন-ক্ল্লাস্টারড সূচক নির্বাচন করে ( index_id
প্রশ্ন মন্তব্যে অনুমিত হিসাবে ক্ষুদ্রতম শারীরিক আকারের সাথে একটি নয়), বা যদি ক্লাস্টারড ইনডেক্স থাকে তবে স্যুট এবং কোনও উপযুক্ত অবিচ্ছিন্ন সূচক নেই। স্কেল সার্ভার ২০০৮ (সংস্করণ 10.0) থেকে এই জাতীয় আচরণটি সামঞ্জস্যপূর্ণ বলে মনে হচ্ছে। এটি অবশ্যই পর্যবেক্ষণ, এই ক্ষেত্রে কোনও গ্যারান্টি নেই।