دردسرهای NULL در DB2
یک NULL در DB2، عدم وجود یا ناشناخته بودن اطلاعاتی را در سطح ستون نمایش می دهد. یک NULL در DB2 با صفر (۰) یا جای خالی یکسان نمی باشند.
NULL به این معنی است که هیچ گونه ورودی برای این ستون وجود ندارد و همچنین اعلام می کند که این داده یا ناشناخته است و یا قابل استفاده نمی باشد.
NULL ،DB2 را پشتیبانی می کند و شما می توانید از NULL جهت تمایز بین ورودی های صفر یا جای خالی و ورودی های غیرقابل استفاده و ناشناخته استفاده کنید.
به NULLها گاهی به اشتباه “داده های NULL” نیز گفته می شود. استفاده کردن از واژه ی “داده” برای NULL صحیح نیست، زیرا یک NULL به نبودن و عدم وجود یک داده اشاره می کند.
بنابراین به سادگی از کلمات NULL یا NULLها به جاید “داده های NULL” استفاده کنید.
NULL ،DB2 را در یک ستون مخفی (Hidden) به نام نشانگر (Indicator) ارائه می دهد. در DB2 برای هر ستونی که میتواند NULL دریافت کند، یک نشانگر تعریف می شود.
نشانگر از دید کاربر پایانی (End-User) پنهان است، اما باید در زمان برنامه نویسی در یک زبان میزبان (مانند cobol یا PL/I) وجود داشته باشد.
NULL-able OR Not NULL-able
در هنگام ساخت هر جدول، باید تعیین کرد که آیا هر ستون، NULL می پذیرد یا نه.
اگر بعد از نام ستون در DB2 چیزی نوشته نشود، به صورت پیشفرض NULL پذیر در نظر گرفته می شود.
برای جلوگیری از تعریف یک ستون به عنوان NULL پذیر، باید حتما عبارت Not NULL را بعد از اسم ستون ذکر کنید.
در جدول زیر، Col1 و Col3، Col4 و Col5، قابلیت NULL پذیری ندارند:
CREATE TABLE SAMPLE1
(COL1 INTEGER,
COL2 CHAR(10) NOT NULL,
COL3 CHAR(5),
COL4 DATE NOT NULL WITH DEFAULT,
COL5 TIME NOT NULL);
جهت مطالعه نحوه ساختن Table در DB2 اینجا را کلیک کنید.
دردسرهای NULL در DB2 چه چیزهایی هستند؟
روشی که NULL در DB2 پردازش می شود، برای افرادی که با روش Yes/No و On/Off فکر می کنند، قابل درک و ملموس نمی باشد.
با NULL ها، پاسخ ها فقط True/False نیستند، بلکه میتواند True/False/Unknown باشد.
به یاد داشته باشید که NULL، ناشناخته (Unknown) است.
پس زمانی که یک NULL در محاسبات ریاضی وارد می شود، پاسخ همواره NULL می باشد.
این به این معنی است که پاسخ تمامی عبارت های زیر NULL است:
- ۵ + NULL
- NULL / 501324
- ۱۰۲ – NULL
- ۵۱۲۳۵ * NULL
- NULL**3
- NULL + NULL
- NULL/0
درسته! حتی با اینکه جواب عبارت آخر از نظر ریاضیدان ها غیر قابل قبول است (به دلیل تقسیم بر صفر)، اما همچنان پاسخ این عبارت NULL می باشد.
یکی دیگر از جنبه های NULL در DB2 این است که تابع های AVG، Count Distinct، SUM، MAX و MIN، ستون هایی که NULL تعریف شده اند را حذف می کند.
در حالیکه تابع COUNT ستون هایی که NULL باشند را حذف نمی کند، به این دلیل که این تابع در سطح ردیف اجرا می شود.
همچنین تابع AVG در ستون هایی که می توانند NULL بپذیرند، با SUM/COUNT برابر نمی باشد.
برای شفاف تر شدن این موضوع به مثال زیر توجه کنید.
اگر ستون COMM در این جدول، NULL-پذیر باشد، نتیجه ی دستور زیر:
SELECT AVG (COMM)
FROM DSN8810.EMP;
با دستور زیر برابر نیست:
SELECT SUM (COMM)/COUNT(*)
FROM DSN8810.EMP;
اما جنبه ی دردسرساز این خصوصیت NULL این است که “پاسخ ها دقیقا چه معنایی می دهند؟”
آیا نباید تابعی که NULL را پردازش می کند، پاسخ NULL یا ناشناخته بازگرداند؟
آیا رد شدن از همه ی ستون هایی که NULL هستند، پاسخ مفیدی بازمیگرداند؟
به نظر چیزی که به شدت نیاز است، یک گزینه برای تابع هاست در زمانی که بر روی ستون های NULL -پذیر عملیاتی را اجرا می کنند. شاید سوییچی که ۳ حالت عملیات را ممکن سازد:
۱- اگر ستونی دارای NULL بود، NULL بازگردانده شود (پیشفرض)
۲- NULL ها را نادیده بگیرد و به صورت فعلی خود، عملیات را اجرا کند.
۳- با همه ی NULL ها مانند صفر (۰) رفتار کند.
حداقل در این روش، کاربر گزینه ای برای انتخاب کردنِ نوع رفتار تابع با NULL دارد. اما هم اکنون اینگونه نیست.
پس برای جلوگیری از هرگونه ابهامی، سعی کنید تا حد امکان از NULL برای ستون هایی که در این توابع شرکت می کنند، خودداری کنید.
مواردی از قوانین عملیات بر روی NULL در DB2:
- وقتی یک ستون NULL پذیر در یک عبارت Order by یا Group by شرکت می کند، گروه NULL های بازگشتی، در نقطه بالایی مرتب سازی قرار می گیرند.
- در زمانی که داده های یکسان (Duplicate) توسط دستور Select Distinct یا Count Distinct حذف می شوند، NULL ها نیز به صورت یکسان محسوب می شوند.
- یک ایندکس یکتا، NULL ها را یکسان در نظر گرفته و جلوی وجود داده های یکسان را میگیرد، مگر اینکه در ایندکس عبارت Where Not NULL قید شده باشد.
جهت مطالعه نحوه ساختن ایندکس، اینجا کلیک کنید.
- برای مقایسه در یک دستور Select، دو NULL یکسان محاسبه نمی شوند. زمانی که یک ستون NULL پذیر در یک عبارت Where یا Having استفاده می شود، NULL هایی که به این عبارت ها بر می خورند، در مقایسه کردن به صورت ناشناخته بررسی می شوند.
- زمانی که یک ستون NULL پذیر در یک محاسبه شرکت می کند، نتیجه NULL است.
- ستون هایی که به عنوان کلید اولیه (Primary Key)استفاده می شوند، نمی تواند NULL باشند.
جهت مطالعه کلیدها (Key) و انواع آن، اینجا کلیک کنید.
- برای آزمودن وجود یک NULL، می توانید در دستور Select، از گزاره ی IS NULL در عبارت Where استفاده کنید.
به خاطر بسپارید که شما نمی توانید به شکل زیر ستون های NULL را انتخاب کنید.
Where Column = NULL
بلکه باید حتما از عبارت کلیدی IS NULL استفاده گردد.
- از آنجایی که NULL به معنی عدم وجود داده می باشد، استفاده کردن از عبارات NULL >= یا NULL<> بی معنی می باشد.
در یک کلام:
Order by، Group by، Distinct و Unique Indexها، NULL ها را یکسان فرض کرده و بر این اساس عملیات انجام می دهد، اما دستورات Select این NULL ها را یکسان در نظر نمی گیرد و به صورت داده های ناشناخته با آن ها رفتار می کند.
این ناسازگاری در مدیریت کردن NULL ها یک ناهنجاری و خطایی ایت که باید در هنگام استفاده از NULL ها در نظر داشته باشید.
مشکلات دیگر در استفاده از NULL در DB2:
- آیا می دانستید که این امکان وجود دارد که یک دستور SQL بنویسید که NULL بازگشت دهد، حتی اگر هیچ ستون NULL پذیری وجود نداشته باشد؟
- فرض کنید در جدول EMP هیچ ستون NULL پذیری وجود ندارد:
SELECT SUM(SALARY)
FROM EMP
WHERE DEPTNO > 999;
اگر هیچ Deptno ای وجود نداشته باشد که بزرگتر از ۹۹۹ باشد، پس نتیجه ی این دستور ما NULL خواهد بود. پس درک کامل NULL ها ممکن است به سادگی امکان پذیر نباشد.
- مشکل دیگر در استفاده از NULL ها زمانی است که برخی از developerها به عبارت NOT IN، دید نادرستی دارند. به مثال زیر توجه کنید:
SELECT C.color
FROM Colors AS C
WHERE C.color NOT IN (SELECT P.color
FROM Products AS P;)
اگر یکی از محصولات، رنگش NULL تنظیم شده باشد، پس نتیجه ی Select ما کلا یک مجموعه ی خالی خواهد بود، حتی اگر رنگی وجود داشته باشد که به هیچ محصولی اختصاص داده نشده باشد.
خلاصه:
NULL ها بدون شک یکی از بحث برانگیزترین ویژگی های DB2 و قطعا بیشتر سیستم های دیتابیسی SQL هستند.
با اینکه NULL ها می توانند گیج کننده باشند، هیچ راه فراری از آنها نیست و اگر شما DB2 را به عنوان DBMS خود انتخاب کرده اید، نمی توانید آن ها را نادیده بگیرید.
فهمیدن اینکه NULL ها چه هستند و چگونه می شود از آن ها به بهترین شکل استفاده کرد، به شما کمک می کند تا دیتابیس های DB2 قابل استفاده ای بسازید و دستورات صحیح و مفیدی را در برنامه های DB2 خود اعمال کنید.
برای مطالعه منبع این مقاله به زبان انگلیسی میتوانید به لینک زیر مراجعه نمایید.
Datavail/Nulls