14 / 100

NOT NULL

Bo'sh bo'lmagan qiymat cheklovi

Kirish: Ushbu darsda siz ma'lumotlar bazasida NULL tushunchasi nima ekanligini, uning uch qiymatli mantiqini (three-valued logic) hamda PostgreSQLda ustunga bo'sh qiymat kiritilishining oldini olish uchun NOT NULL cheklovidan foydalanishni o'rganasiz.


NULL tushunchasi haqida

Ma'lumotlar bazasida NULL qiymatning mavjud emasligini, ya'ni ma'lumot noma'lum yoki kiritilmagan ekanligini bildiradi.

Masalan, siz ombor haqidagi ma'lumotlarni bazaga kiritayotganda uning aniq manzilini hali bilmasangiz, address ustuniga NULL yozib turishingiz mumkin. Keyinchalik manzil aniq bo'lganda, UPDATE orqali uni yangilash mumkin bo'ladi.

[!IMPORTANT] NULL — bu bo'sh satr ('') yoki nol (0) emas!

  • '' (bo'sh satr) — bu uzunligi 0 ga teng bo'lgan aniq matn qiymatidir.
  • 0 (nol) — bu aniq sonli qiymatdir.
  • NULL — esa qiymatning umuman yo'qligi (noma'lumligi) demakdir.

NULL ning uch qiymatli mantiqi (Three-valued logic)

PostgreSQLda NULL bilan bog'liq solishtirishlar maxsus uch qiymatli mantiqqa asoslanadi: har qanday qiymatni NULL bilan taqqoslaganda natija yana NULL (noma'lum) bo'ladi.

Masalan, son bilan taqqoslash:

query.sql
SELECT NULL = 1 AS result;

Natija:

kod
 result 
--------
 NULL

Hatto NULL ni boshqa NULL bilan taqqoslash ham NULL qaytaradi:

query.sql
SELECT NULL = NULL AS result;

Bu mutlaqo mantiqiydir: noma'lum bir narsani boshqa noma'lum narsa bilan solishtirganda, ularning teng yoki teng emasligi ham noma'lum bo'lib qoladi.


Sukut bo'yicha ustunlar (Nullable)

Odatiy holatda, jadval ustunlari yaratilganda ularga NULL qiymatlarni kiritishga ruxsat beriladi.

Masalan, quyidagi warehouses jadvalini ko'raylik:

query.sql
CREATE TABLE warehouses (
  warehouse_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name VARCHAR(255),
  address VARCHAR(255)
);

Bu yerda name va address ustunlari VARCHAR turida bo'lsa-da, ular bemalol NULL qabul qiladi:

query.sql
INSERT INTO warehouses (name, address)
VALUES ('San Jose', NULL)
RETURNING name, address;

Agar INSERT buyrug'ida biror ustunni yozmasdan tashlab ketsangiz, PostgreSQL unga avtomatik ravishda NULL qiymatini o'rnatadi:

query.sql
INSERT INTO warehouses (name)
VALUES ('San Francisco')
RETURNING name, address;

Natija:

nameaddress
San FranciscoNULL

NOT NULL cheklovidan foydalanish

Jadval ustunida har doim haqiqiy ma'lumot bo'lishini va hech qachon NULL kiritilmasligini talab qilish uchun NOT NULL cheklovi ishlatiladi:

query.sql
ustun_nomi data_type NOT NULL

Agar ustunga NOT NULL qo'yilgan bo'lsa, unga NULL kiritishga urinish xatolik bilan rad etiladi.

[!NOTE] Barcha asosiy kalit (PRIMARY KEY) ustunlari sukut bo'yicha o'z-o'zidan NOT NULL xususiyatiga ega bo'ladi.

Nima uchun NOT NULL juda muhim?

  1. Ma'lumotlar yaxlitligi (Data Integrity): Masalan, foydalanuvchining elektron pochtasi yoki tovarning nomi doimo mavjud bo'lishi shart.
  2. Koddagi xatoliklarning oldini oladi: NULL qiymatlar dasturlarda kutilmagan xatoliklarni (NullPointerException yoki nil dereference) keltirib chiqarishi mumkin.
  3. So'rovlar samaradorligi: Dasturchi har bir so'rovda NULL ni tekshirish uchun ortiqcha kod yozishiga hojat qolmaydi.

Amaliy misol: NOT NULL cheklovi bilan ishlash

Avval eski jadvalni o'chiramiz va name hamda address ustunlariga NOT NULL cheklovini o'rnatamiz:

query.sql
DROP TABLE IF EXISTS warehouses;

CREATE TABLE warehouses (
  warehouse_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  address VARCHAR(255) NOT NULL
);

Endi address ustuniga NULL kiritishga urinib ko'ramiz:

query.sql
INSERT INTO warehouses (name, address)
VALUES ('San Mateo', NULL);

PostgreSQL qaytargan xatolik:

kod
ERROR: null value in column "address" of relation "warehouses" violates not-null constraint

PostgreSQL qoidabuzarlikni aniqladi va ma'lumot qo'shilishini to'xtatdi!

Endi to'g'ri, to'liq manzil bilan qator kiritamiz:

query.sql
INSERT INTO warehouses (name, address)
VALUES (
  'San Mateo',
  '1st Ave Suite K03, San Mateo, CA 94403'
)
RETURNING *;

Natija:

warehouse_idnameaddress
1San Mateo1st Ave Suite K03, San Mateo, CA 94403

Ma'lumot muvaffaqiyatli saqlandi!


Xulosa

  • NULL ma'lumotning yo'qligini yoki noma'lumligini bildiradi (u 0 yoki '' ga teng emas).
  • NULL bilan bog'liq har qanday taqqoslash yana NULL qaytaradi.
  • Sukut bo'yicha ustunlar NULL qiymatlarni qabul qiladi.
  • Ustunda doimo qiymat bo'lishini ta'minlash uchun NOT NULL cheklovi qo'llaniladi.
QBilimingizni sinab ko'ring
1 / 5

1. PostgreSQLda NULL nimani bildiradi?