প্রযুক্তিগতভাবে, NULL = NULL মিথ্যা, সেই যুক্তি অনুসারে কোনও NULL কোনও NUL এর সমান নয় এবং সমস্ত NULL আলাদা। এর অর্থ কি এই বোঝা যায় না যে সমস্ত NULs অনন্য এবং একটি অনন্য সূচককে NUL এর কোনও সংখ্যার অনুমতি দেওয়া উচিত?
প্রযুক্তিগতভাবে, NULL = NULL মিথ্যা, সেই যুক্তি অনুসারে কোনও NULL কোনও NUL এর সমান নয় এবং সমস্ত NULL আলাদা। এর অর্থ কি এই বোঝা যায় না যে সমস্ত NULs অনন্য এবং একটি অনন্য সূচককে NUL এর কোনও সংখ্যার অনুমতি দেওয়া উচিত?
উত্তর:
কেন এটি এভাবে কাজ করে? কারণ ফিরে যাওয়ার সময়, কেউ মানকটি কী জেনে বা যত্ন না করে একটি ডিজাইনের সিদ্ধান্ত নিয়েছে (সর্বোপরি, আমাদের সাথে সমস্ত ধরণের অদ্ভুত আচরণ রয়েছে NULLএবং ইচ্ছায় বিভিন্ন আচরণ বাধ্য করতে পারি)। এই সিদ্ধান্ত যে এই ক্ষেত্রে NULL = NULL,।
এটি খুব স্মার্ট সিদ্ধান্ত ছিল না। তাদের যা করা উচিত ছিল তা হ'ল এএনএসআই স্ট্যান্ডার্ডের ডিফল্ট আচরণটি মেনে চলা এবং যদি তারা সত্যিই এই অদ্ভুত আচরণটি চায়, তবে ডিডিএল বিকল্পের মতো WITH CONSIDER_NULLS_EQUALবা এর মাধ্যমে অনুমতি দিন WITH ALLOW_ONLY_ONE_NULL।
অবশ্যই, হ্যান্ডসাইট 20/20।
এবং আমাদের কাছে এখন একদম কাজ আছে, যাইহোক, যদিও এটি সবচেয়ে পরিষ্কার বা স্বজ্ঞাত নয়।
আপনি এসকিউএল সার্ভার ২০০৮ এবং তারপরে একটি অনন্য, ফিল্টারড সূচক তৈরি করে যথাযথ এএনএসআই আচরণ পেতে পারেন।
CREATE UNIQUE INDEX foo ON dbo.bar(key) WHERE key IS NOT NULL;
এটি একাধিক NULLমানকে অনুমতি দেয় কারণ সেই সারিগুলি সদৃশ চেকিংয়ের বাইরে পুরোপুরি ছেড়ে গেছে। একটি যুক্ত বোনাস হিসাবে, এটি একের চেয়ে ছোট সূচক হিসাবে শেষ হবে যা পুরো টেবিলের সাথে একত্রে NULLঅনুমতি দেওয়া থাকলে (বিশেষত যখন এটি সূচীতে একমাত্র কলাম নয়, এতে INCLUDEকলামগুলি রয়েছে )। তবে আপনি ফিল্টারড সূচকগুলির অন্যান্য কিছু সীমাবদ্ধতা সম্পর্কে সচেতন হতে চাইতে পারেন:
সঠিক। স্কিএল সার্ভারে একটি অনন্য বাধা বা সূচি বাস্তবায়নের ফলে একটি এবং কেবলমাত্র একটি নূলকে অনুমতি দেওয়া হয়। এটিকেও সঠিক করুন যে এই প্রযুক্তিগতভাবে NULL এর সংজ্ঞার সাথে খাপ খায় না তবে এটি "প্রযুক্তিগতভাবে" সঠিক না হলেও এটি আরও কার্যকর করার জন্য তারা করেছিলেন things একটি প্রাথমিক কী নোট করুন (এছাড়াও একটি অনন্য সূচক) NULL (অবশ্যই) অনুমতি দেয় না।
প্রথম - "নাল মান" শব্দটি ব্যবহার করা বন্ধ করুন, এটি আপনাকে কেবল পথভ্রষ্ট করবে। পরিবর্তে, "নাল মার্কার" বাক্যাংশটি ব্যবহার করুন - একটি কলামে চিহ্নিত একটি মার্কার যা এই কলামের আসল মানটি অনুপস্থিত বা অগ্রহণযোগ্য (তবে লক্ষ করুন যে চিহ্নিতকারীটি সেই বিকল্পগুলির মধ্যে আসলে কোনটি ক্ষেত্রে ক্ষেত্রে নেই)।
এখন, নিম্নলিখিতটি কল্পনা করুন (যেখানে ডাটাবেসের মডেল পরিস্থিতি সম্পর্কে সম্পূর্ণ জ্ঞান নেই)।
Situation Database
ID Code ID Code
-- ----- -- -----
1 A 1 A
2 B 2 (null)
3 C 3 C
4 B 4 (null)
আমরা যে সততা বিধি মডেলিং করছি তা হ'ল "কোডটি অবশ্যই অনন্য হওয়া উচিত"। বাস্তব-বিশ্বের পরিস্থিতি এটিকে লঙ্ঘন করে, তাই ডাটাবেস 2 এবং 4 উভয় আইটেমকে একই সময়ে টেবিলে থাকতে দেবে না।
সবচেয়ে নিরাপদ এবং স্বল্পতম-নমনীয়, পদ্ধতির ক্ষেত্রে কোড ক্ষেত্রে নাল চিহ্নিতকারীদের বারণ করা হবে, সুতরাং অসামঞ্জস্যপূর্ণ ডেটার কোনও সম্ভাবনা নেই। সর্বাধিক নমনীয় পদ্ধতি হ'ল একাধিক নাল চিহ্নিতকারীকে অনুমতি দেওয়া এবং মানগুলি প্রবেশ করার সময় স্বতন্ত্রতা সম্পর্কে চিন্তা করা worry
সাইবাস প্রোগ্রামাররা কিছুটা নিরাপদ, খুব নমনীয় পদ্ধতির সাথে চলে গেল কেবলমাত্র টেবিলের মধ্যে একটি নাল চিহ্নিতকারীকে অনুমতি দেওয়ার - যা কিছু মন্তব্যকারী তখন থেকেই অভিযোগ করে আসছেন। মাইক্রোসফ্ট এই আচরণটি অব্যাহত রেখেছে, আমি অনুমান করি যে পিছনের সামঞ্জস্যের জন্য।
¹ আমি নিশ্চিত যে আমি কোথাও পড়েছি যে কোডড দুটি নাল চিহ্নিতকারীগুলি প্রয়োগ করা বিবেচনা করেছিল - একটি অজানা জন্য, একটি প্রয়োগযোগ্য নয় - তবে এটি প্রত্যাখ্যান করেছিল, তবে আমি উল্লেখটি পাই না। আমি কি ঠিক মনে করছি?
পিএস নাল সম্পর্কে আমার প্রিয় উক্তি: লুই ডেভিডসন, "প্রফেশনাল এসকিউএল সার্ভার 2000 ডেটাবেস ডিজাইন", রোকস প্রেস, 2001, পৃষ্ঠা 52 "
nullএই লক্ষ্য অর্জন করে না। কারণ অনুপস্থিত মানটি অন্য সারির একটির মানের মতো হতে পারে।
CHECK (Value IN ('A','B','C','D'))? তারপরে এসকিউএল-সার্ভারের প্রয়োগকরণ এবং এসকিউএল স্ট্যান্ডার্ড উভয়ই সারণীতে 5 টি সারি রাখার অনুমতি দেয় (প্রতিটি মানের জন্য একটি সারি NULL সহ 1)। তারপরে, তাত্ক্ষণিকভাবে, যখন ডাটাবেসটি তার সীমাবদ্ধতার সাথে সামঞ্জস্যপূর্ণ, এটি ডিজাইনারের অভিপ্রায়ের সাথে সামঞ্জস্যপূর্ণ নয় সারণিটি সর্বোচ্চ 4 টি সারি রয়েছে। এক বা একাধিক সারি মুছে ফেলা না হয় এমন কোনও মূল্য নেই যে নূলে পরিবর্তন করা যেতে পারে যা কোনও সীমাবদ্ধতা লঙ্ঘন করবে না।
CREATE TABLE #T(A INT NULL UNIQUE);INSERT INTO #T VALUES (1),(NULL);UPDATE #T SET A = 1 WHERE A IS NULL;একটি ত্রুটি উত্থাপন করবে। আপনার নকশা প্রেরণার তত্ত্ব অনুসারে NULLএটি প্রথম ক্ষেত্রে সন্নিবেশকে বাধা দেওয়া উচিত ছিল - কারণ অসম্পূর্ণ জ্ঞানের অর্থ মান আলাদা হওয়ার কোনও গ্যারান্টি নেই।
এটি প্রযুক্তিগতভাবে সঠিক নাও হতে পারে, তবে দার্শনিকভাবে এটি আমাকে রাতে ঘুমাতে সহায়তা করে ...
অন্য অনেকে যেমন বলেছেন বা ইঙ্গিত করেছেন, আপনি যদি NUL কে অজানা হিসাবে ভাবেন, তবে আপনি নির্ধারণ করতে পারবেন না যে একটি NULL মান আসলে অন্য NULL মানের সমান whether এটিকে এভাবে ভাবতে ভাবতে NULL == NULL অভিব্যক্তিটি NULL এর কাছে মূল্যায়ন করা উচিত, যার অর্থ অজানা।
কলাম মানগুলির তুলনা করার জন্য একটি অনন্য প্রতিবন্ধকতার একটি নির্দিষ্ট মান প্রয়োজন need অন্য কথায়, সাম্যতা অপারেটরটি ব্যবহার করে অন্য কোনও কলামের মানের সাথে একক কলাম মানকে তুলনা করার সময়, এটি অবশ্যই বৈধ হওয়ার জন্য মিথ্যাতে মূল্যায়ন করতে হবে। অজানা সত্যই মিথ্যা নয় যদিও এটি প্রায়শই মিথ্যা হিসাবে বিবেচিত হয়। দুটি নূন্যমূল্য সমান হতে পারে, নাও ... এটি কেবল নির্ধারিতভাবে নির্ধারণ করা যায় না।
এটি একে অপরের থেকে স্বতন্ত্র হওয়ার জন্য নির্ধারিত মানগুলিকে সীমাবদ্ধ হিসাবে অনন্য প্রতিবন্ধকতা ভাবতে সহায়তা করে। আমি এর দ্বারা যা বোঝাতে চাইছি তা হ'ল যদি আপনি এমন একটি নির্বাচন চালান যা দেখতে দেখতে কিছুটা এমন দেখাচ্ছে:
SELECT * from dbo.table1 WHERE ColumnWithUniqueContraint="some value"
একটি অনন্য সীমাবদ্ধতা দেওয়া সত্ত্বেও বেশিরভাগ লোক একটি ফলাফল আশা করবে। আপনি যদি কলাম উইথউইনিক কনস্ট্রেন্টে একাধিক NULL মানকে মঞ্জুরি দিয়ে থাকেন তবে তুলনামূলক মান হিসাবে NULL ব্যবহার করে টেবিল থেকে একটি স্বতন্ত্র সারি নির্বাচন করা অসম্ভব।
এটি দেওয়া, আমি বিশ্বাস করি যে এটি NUL এর সংজ্ঞা সম্মানের সাথে সঠিকভাবে প্রয়োগ করা হয়েছে বা না করুক না কেন, বেশিরভাগ পরিস্থিতিতে এটি একাধিক NULL মানকে অনুমোদনের চেয়ে অবশ্যই অনেক বেশি ব্যবহারিক।
UNIQUEসীমাবদ্ধতার অন্যতম প্রধান উদ্দেশ্য হ'ল নকল রেকর্ড প্রতিরোধ করা। যদি একটি টেবিল থাকা দরকার যেখানে একাধিক রেকর্ড থাকতে পারে যেখানে মানটি "অজানা" থাকে তবে দুটি রেকর্ডকে একই "জ্ঞাত" মান রাখার অনুমতি দেওয়া হয় না, তবে অজানা মানগুলি হবার আগে কৃত্রিম অনন্য শনাক্তকারীকে অর্পণ করা উচিত টেবিলে যুক্ত।
কয়েকটি দুর্লভ কেস রয়েছে যার মধ্যে একটি কলামে UNIQUEপ্রতিবন্ধকতা রয়েছে এবং এতে একক নাল মান রয়েছে; উদাহরণস্বরূপ, যদি কোনও টেবিলটিতে কলাম মান এবং স্থানীয় বর্ণিত পাঠ্য বিবরণগুলির মধ্যে ম্যাপিং থাকে NULLতবে এর জন্য একটি সারি বর্ণনার সংজ্ঞা দেওয়া সম্ভব করে যে যখন অন্য কোনও টেবিলের সেই কলামটি প্রদর্শিত হবে তখন প্রদর্শিত হবে NULL। এর ব্যবহার NULLসেই ব্যবহারের ক্ষেত্রে অনুমতি দেয়।
অন্যথায়, আমি UNIQUEঅনেকগুলি অভিন্ন রেকর্ডের অস্তিত্বের অনুমতি দেওয়ার জন্য কোনও কলামে একটি সীমাবদ্ধতা সহ একটি ডাটাবেসের কোনও ভিত্তি দেখতে পাচ্ছি না , তবে আমি এমন একাধিক রেকর্ডের অনুমতি দিচ্ছি যার মূল মানগুলি পৃথক নয়। NULLএটি নিজের সমান নয় বলে ঘোষণা করা NULLমান একে অপরের থেকে পৃথক করে তুলবে না ।