# SQL constraint — ustun cheklovlari

> SQL constraint (cheklov) turlari: NOT NULL, UNIQUE, CHECK va DEFAULT. Ma'lumot bazaga kirishdan oldin qoidalarni tekshirib, xato qiymatlarni to'sish.

Manba: https://learncode.uz/sql/constraint/
Sana: 2026-06-17

Baza faqat ma'lumot saqlamaydi — u ma'lumot **to'g'ri** bo'lishini ham
kuzatishi mumkin. Masalan narx manfiy bo'lmasligi yoki email takrorlanmasligi
kerak. Bu qoidalar **constraint** (cheklov) deyiladi. Ular jadval yaratilganda
belgilanadi va noto'g'ri qiymatni bazaga **kiritmaydi**.

[Primary key va foreign key](https://learncode.uz/sql/primary-foreign-key) ham aslida constraint
edi. Endi qolgan asosiy turlarni ko'ramiz.

## Asosiy constraint turlari

Ularni [`CREATE TABLE`](https://learncode.uz/sql/create-table) da, ustun tipidan keyin yozamiz:

```sql
CREATE TABLE hodimlar (
  id     INTEGER PRIMARY KEY,
  ism    TEXT NOT NULL,
  email  TEXT UNIQUE,
  maosh  INTEGER CHECK (maosh > 0),
  faol   INTEGER DEFAULT 1
);
```

O'zingiz ishga tushirib ko'ring — so'rovni tahrirlashingiz ham mumkin:

```sql
-- NOT NULL cheklovini buzib ko'ramiz:
INSERT INTO mahsulotlar (id, nom, narx, soni)
VALUES (99, NULL, 5000, 10);
```

Har cheklov o'z vazifasini bajaradi:

- **`NOT NULL`** — ustun bo'sh (`NULL`) bo'lolmaydi. `ism` majburiy.
- **`UNIQUE`** — qiymat takrorlanmaydi. Ikki hodimda bir xil `email` bo'lolmaydi.
- **`CHECK (shart)`** — qiymat shartga mos bo'lishi kerak. `maosh` musbat bo'lsin.
- **`DEFAULT qiymat`** — kiritilmasa, avtomatik qiymat qo'yiladi. `faol` — `1`.

## Cheklov qanday himoya qiladi

Cheklovga zid qiymat kiritmoqchi bo'lsangiz, baza qatorni **rad etadi**.
Masalan manfiy maosh:

```sql
INSERT INTO hodimlar (id, ism, maosh) VALUES (1, 'Aziz', -500);
```

`CHECK (maosh > 0)` buzildi, shuning uchun bu `INSERT` bajarilmaydi — baza
xato qaytaradi. Xuddi shunday, bir xil `email` ni ikki marta kiritsangiz,
`UNIQUE` uni to'sadi.

> **Atama**
>
> **Constraint** (cheklov) — ustun qiymatiga qo'yilgan qoida. U ma'lumot bazaga
> **kirishdan oldin** tekshiriladi. Shu tufayli "buzuq" ma'lumot bazaga umuman
> tushmaydi — tozalikni dastur emas, bazaning o'zi ta'minlaydi.

<Callout type="example" title="O'zingizni sinab ko'ring">
`DEFAULT` ni sinang. `faol` ni kiritmasdan hodim qo'shing:

```sql
INSERT INTO hodimlar (id, ism, email, maosh)
VALUES (2, 'Dilnoza', 'dilnoza@mail.uz', 3000000);

SELECT ism, faol FROM hodimlar WHERE id = 2;
```

Natijada `faol` avtomatik `1` bo'ladi — chunki `DEFAULT 1` shunday belgilagan.
</Callout>

> **Boshlovchilar tez-tez yanglishadigan joy**
>
> `NULL` va `UNIQUE` birga bo'lganda: aksariyat bazalarda `UNIQUE` ustunda bir
> nechta `NULL` bo'lishiga ruxsat beriladi, chunki `NULL`lar bir-biriga teng
> deb hisoblanmaydi. Qiymat majburiy bo'lishi kerak bo'lsa, `UNIQUE` ustiga
> `NOT NULL` ni ham qo'shing.

## Amaliy mashq

Cheklovlarni sinang:

1. `nom` ustuniga `NULL` qiymat qo'yishga urining;
2. qanday xato chiqqanini o'qing;
3. `id` ni takrorlashga urining;
4. `NOT NULL` bo'lgan ustunni tashlab `INSERT` qiling;
5. barcha majburiy ustunlarni to'g'ri to'ldirib, muvaffaqiyatli qo'shing;
6. `CHECK (narx > 0)` li jadval yaratib, manfiy narx bilan `INSERT`
   qiling — cheklov qatorni to'sganini ko'ring.

Cheklovlar ma'lumot sifatini qanday himoya qilyapti?

## Qisqacha xulosa

- **Constraint** — ustun qiymatiga qo'yilgan qoida; buzuq ma'lumotni to'sadi.
- `NOT NULL` — bo'sh bo'lolmaydi; `UNIQUE` — takrorlanmaydi.
- `CHECK (shart)` — qiymat shartga mos bo'lishi shart (masalan `maosh > 0`).
- `DEFAULT` — kiritilmasa, avtomatik qiymat beradi.
- Cheklov bazaga **kirishdan oldin** tekshiriladi — tozalik kafolatlanadi.

Keyingi darsda [VIEW](https://learncode.uz/sql/view) — murakkab so'rovni "virtual jadval" sifatida
saqlab, qayta ishlatishni ko'ramiz.
