ফিল্টার অনন্য সূচক একটি উজ্জ্বল ধারণা কিন্তু এটা একটি ছোটখাট অসুবিধা আছে - কোন ব্যাপার যদি আপনি ব্যবহার WHERE identity_column > <current value>
শর্ত বা WHERE identity_column NOT IN (<list of ids for duplicate values here>)
।
প্রথম পদ্ধতির সাহায্যে আপনি এখনও ভবিষ্যতে সদৃশ ডেটা, বিদ্যমান (এখন) ডেটারের নকল সন্নিবেশ করতে সক্ষম হবেন। উদাহরণস্বরূপ, যদি আপনার এখন (কেবলমাত্র একটি) সারি থাকে CompanyName = 'Software Inc.'
তবে সূচক একই সংস্থার নামের সাথে আরও একটি সারি সন্নিবেশ করতে নিষেধ করবে না। আপনি কেবল দু'বার চেষ্টা করলে এটি এটি নিষিদ্ধ করবে।
দ্বিতীয় পদ্ধতির সাথে একটি উন্নতি আছে, উপরেরটি কাজ করবে না (যা ভাল)) তবে, আপনি আরও ডুপ্লিকেট বা বিদ্যমান নকল সন্নিবেশ করতে সক্ষম হবেন। উদাহরণস্বরূপ, আপনার যদি এখন (দুই বা ততোধিক) সারি থাকে CompanyName = 'DoubleData Co.'
তবে সূচক একই সংস্থার নামের সাথে আরও একটি সারি সন্নিবেশ করতে নিষেধ করবে না। আপনি কেবল দু'বার চেষ্টা করলে এটি এটি নিষিদ্ধ করবে।
(আপডেট) প্রতিটি ডুপ্লিকেট নামের জন্য, আপনি বাদ দেওয়া তালিকার একটি আইডি বাইরে রাখলে এটি সংশোধন করা যায়। যদি উপরের উদাহরণের মতো, সদৃশ CompanyName = DoubleData Co.
এবং আইডি সহ 4 টি সারি থাকে 4,6,8,9
, তবে বাদ পড়ার তালিকায় এই আইডিগুলির মধ্যে কেবল 3 টি থাকা উচিত।
দ্বিতীয় পদ্ধতির সাথে আরেকটি অসুবিধা হ'ল জটিল পরিস্থিতি (প্রথম স্থানটিতে কতগুলি নকল রয়েছে তার উপর কতটা জটিলতা নির্ভর করে), যেহেতু এসকিউএল-সার্ভার ফিল্টারড সূচকগুলির অংশটিতে NOT IN
অপারেটরটিকে সমর্থন করে না WHERE
। দেখুন এসকিউএল বেহালার । পরিবর্তে WHERE (CompanyID NOT IN (3,7,4,6,8,9))
, আপনার এমন কিছু থাকতে হবে যেমন WHERE (CompanyID <> 3 AND CompanyID <> 7 AND CompanyID <> 4 AND CompanyID <> 6 AND CompanyID <> 8 AND CompanyID <> 9)
আমি নিশ্চিত নই যে এই জাতীয় শর্তের সাথে দক্ষতার সাথে জড়িত রয়েছে কিনা, যদি আপনার শত শত নকল নাম থাকে।
আরেকটি সমাধান (@ অ্যালেক্স কুজনেটসভের অনুরূপ) হ'ল অন্য কলাম যুক্ত করা, র্যাঙ্ক সংখ্যার সাথে এটি বিশিষ্ট করা এবং এই কলাম সহ একটি অনন্য সূচক যুক্ত করা:
ALTER TABLE Company
ADD Rn TINYINT DEFAULT 1;
UPDATE x
SET Rn = Rnk
FROM
( SELECT
CompanyID,
Rn,
Rnk = ROW_NUMBER() OVER (PARTITION BY CompanyName
ORDER BY CompanyID)
FROM Company
) x ;
CREATE UNIQUE INDEX CompanyName_UQ
ON Company (CompanyName, Rn) ;
তারপরে, সদৃশ নামের সাথে একটি সারি সন্নিবেশ করা DEFAULT 1
সম্পত্তি এবং অনন্য সূচকের কারণে ব্যর্থ হবে । এটি এখনও 100% বুদ্ধিমান নয় (যদিও অ্যালেক্সের রয়েছে)। যদি বিবৃতিতে Rn
স্পষ্টভাবে সেট করা INSERT
থাকে বা Rn
মানগুলি দূষিতভাবে আপডেট করা হয় তবে ডুপ্লিকেটগুলি এখনও পিছলে যাবে ।
এসকিউএল বেহালার-2