এসকিউএল সার্ভার ২০০৮ এবং তারপরে
কেবল একটি অনন্য সূচক ফিল্টার করুন:
CREATE UNIQUE NONCLUSTERED INDEX UQ_Party_SamAccountName
ON dbo.Party(SamAccountName)
WHERE SamAccountName IS NOT NULL;
নিম্ন সংস্করণগুলিতে, এখনও একটি বস্তুগত দর্শন প্রয়োজন হয় না
এসকিউএল সার্ভার 2005 এবং এর আগের জন্য, আপনি এটি কোনও দর্শন ছাড়াই করতে পারেন। আপনি আমার টেবিলে যে কোনওটিকে চাইছেন বলে আমি কেবল একটি অনন্য বাধা যুক্ত করেছি। আমি কলামে স্বতন্ত্রতা চাই SamAccountName
, কিন্তু আমি একাধিক এনএলএলকে অনুমতি দিতে চাই, আমি বস্তুগত দৃশ্যের পরিবর্তে একটি বস্তুযুক্ত কলাম ব্যবহার করেছি:
ALTER TABLE dbo.Party ADD SamAccountNameUnique
AS (Coalesce(SamAccountName, Convert(varchar(11), PartyID)))
ALTER TABLE dbo.Party ADD CONSTRAINT UQ_Party_SamAccountName
UNIQUE (SamAccountNameUnique)
আসল পছন্দসই অনন্য কলামটি ন্যূনাল হলে আপনাকে কেবল গণিত কলামে এমন কিছু রাখতে হবে যা পুরো টেবিল জুড়ে অনন্যতার গ্যারান্টিযুক্ত হবে। এই ক্ষেত্রে, PartyID
এটি একটি পরিচয় কলাম এবং সংখ্যাযুক্ত হওয়া কোনওর সাথে মেলে না SamAccountName
, তাই এটি আমার পক্ষে কাজ করেছিল। আপনি নিজের পদ্ধতিটি চেষ্টা করতে পারেন - নিশ্চিত হয়ে নিন যে আপনি নিজের ডেটা ডোমেন বুঝতে পেরেছেন যাতে সত্যিকারের ডেটা দিয়ে ছেদ হওয়ার কোনও সম্ভাবনা নেই। এটি এর মতো একটি ডিফরিনেটর চরিত্রটি সরবরাহ করার মতো সহজ হতে পারে:
Coalesce('n' + SamAccountName, 'p' + Convert(varchar(11), PartyID))
এমনকি যদি PartyID
কোনও দিন অ-সংখ্যাসূচক হয়ে যায় এবং এটি একটির সাথে মিলিত হতে পারে তবে SamAccountName
এখন এটি কোনও বিষয় নয়।
নোট করুন যে গণনা কলাম সহ একটি সূচকের উপস্থিতি স্পষ্টতই প্রতিটি অভিব্যক্তির ফলাফলকে টেবিলের অন্যান্য ডেটার সাথে ডিস্কে সংরক্ষণ করতে পারে, যা অতিরিক্ত ডিস্কের জায়গা নেয়।
মনে রাখবেন যে আপনি যদি কোনও সূচি চান না, আপনি PERSISTED
কলাম এক্সপ্রেশন সংজ্ঞাটির শেষে কীওয়ার্ড যুক্ত করে ডিস্কে এক্সপ্রেশনটিকে প্রাক্কলকুলেটেড করে সিপিইউ সংরক্ষণ করতে পারেন ।
এসকিউএল সার্ভার ২০০৮ এবং তারপরে, সম্ভবত আপনি যদি পারেন তবে এর পরিবর্তে অবশ্যই ফিল্টারযুক্ত সমাধানটি ব্যবহার করুন!
বিতর্ক
দয়া করে নোট করুন যে কিছু ডাটাবেস পেশাদাররা এটিকে "সারোগেট এনএলএলএস" হিসাবে দেখবে, এতে অবশ্যই সমস্যা আছে (বেশিরভাগ ক্ষেত্রে যখন কোনও আসল মূল্য বা অনুপস্থিত তথ্যগুলির জন্য একটি সারোগেট মান হয় তা নির্ধারণের চেষ্টা করার কারণে সমস্যাগুলিও হতে পারে; সমস্যাগুলিও হতে পারে পাগলের মতো গুণিতকৃত নন-নুল সারোগেট মান সহ)।
তবে আমি বিশ্বাস করি এই মামলাটি আলাদা। আমি যে গণিত কলামটি যুক্ত করছি তা কখনই কোনও কিছু নির্ধারণের জন্য ব্যবহৃত হবে না। এটির নিজের কোনও অর্থ নেই, এবং ইতিমধ্যে পৃথকভাবে অন্য, সঠিকভাবে সংজ্ঞায়িত কলামগুলিতে পাওয়া যায় নি এমন কোনও তথ্য এনকোড করে। এটি কখনও নির্বাচন বা ব্যবহার করা উচিত নয়।
সুতরাং, আমার গল্পটি হ'ল এটি কোনও সারোগেট নুল নয়, এবং আমি এটির সাথে লেগে আছি! যেহেতু আমরা UNIQUE
সূচককে NULL উপেক্ষা করার জন্য অন্য কোনও উদ্দেশ্যে নন-নুল মানটি প্রকৃতপক্ষে চাই না , আমাদের ব্যবহারের ক্ষেত্রে সাধারণ সরোজেট ন্যূনাল ক্রিয়েশন নিয়ে যে সমস্যা দেখা দেয় তার কোনওটিই নেই।
যা যা বলেছিল, তার পরিবর্তে সূচী দৃষ্টিভঙ্গি ব্যবহার করতে আমার কোনও সমস্যা নেই — তবে এটি এর সাথে কিছু সমস্যা নিয়ে আসে যেমন ব্যবহারের প্রয়োজনীয়তা SCHEMABINDING
। আপনার বেস টেবিলটিতে একটি নতুন কলাম যুক্ত করতে মজা করুন (আপনাকে সর্বনিম্ন সূচিটি ফেলে দিতে হবে, এবং তারপরে দৃশ্যটি বাদ দিতে হবে বা স্কিমার সীমাবদ্ধ না হওয়ার জন্য দৃশ্যটি পরিবর্তন করতে হবে)। এসকিউএল সার্ভার (2005) (এছাড়াও পরবর্তী সংস্করণ), (2000) এ ইনডেক্সেড ভিউ তৈরির জন্য প্রয়োজনীয়গুলির দীর্ঘ (দীর্ঘ) তালিকাগুলি দেখুন ।
হালনাগাদ
যদি আপনার কলামটি সংখ্যাসূচক হয়, তবে অনন্য সীমাবদ্ধতা ব্যবহারের Coalesce
ফলে সংঘর্ষের ফলস্বরূপ না তা নিশ্চিত করার চ্যালেঞ্জ হতে পারে । সেক্ষেত্রে কিছু বিকল্প রয়েছে। একটি ".ণাত্মক নম্বর" কেবলমাত্র নেতিবাচক সীমার মধ্যে রাখার জন্য, এবং "সত্যিকারের মানগুলি" কেবল ধনাত্মক পরিসরে ব্যবহার করার জন্য একটি নেতিবাচক সংখ্যা ব্যবহার করা যেতে পারে। পর্যায়ক্রমে, নিম্নলিখিত প্যাটার্ন ব্যবহার করা যেতে পারে। সারণীতে Issue
(কোথায় IssueID
রয়েছে PRIMARY KEY
) একটি থাকতে পারে বা নাও থাকতে পারে TicketID
তবে যদি তা থাকে তবে তা অবশ্যই অনন্য।
ALTER TABLE dbo.Issue ADD TicketUnique
AS (CASE WHEN TicketID IS NULL THEN IssueID END);
ALTER TABLE dbo.Issue ADD CONSTRAINT UQ_Issue_Ticket_AllowNull
UNIQUE (TicketID, TicketUnique);
যদি ইস্যুআইডি 1 এর টিকিট 123 থাকে তবে UNIQUE
সীমাবদ্ধতা মানগুলিতে হবে (123, NULL)। যদি ইস্যুআইডি 2 এর কোনও টিকিট না থাকে তবে তা চালু থাকবে (NULL, 2)। কিছু ভাবা দেখিয়ে দেবে যে এই সীমাবদ্ধতাটি টেবিলের কোনও সারির জন্য নকল করা যাবে না এবং এখনও একাধিক NULL অনুমতি দেয়।