82 / 100

UNIQUE INDEX

Noyob indekslar

Ushbu qo'llanmada PostgreSQLda jadvalning bitta yoki bir nechta ustunlarida qiymatlar takrorlanmasligini (noyobligini) kafolatlash uchun UNIQUE INDEX dan qanday foydalanishni o'rganasiz.

PostgreSQL UNIQUE INDEX haqida umumiy tushuncha

Noyob indeks (Unique Index) bitta yoki bir nechta ustunlardagi ma'lumotlar barcha qatorlar bo'yicha noyob bo'lishini ta'minlaydi va ma'lumotlar butunligini kafolatlaydi.

Agar noyob indeks o'rnatilgan ustunga allaqachon mavjud bo'lgan qiymatni kiritishga yoki yangilashga urinsangiz, PostgreSQL xatolik qaytaradi.

CREATE UNIQUE INDEX sintaksisi:

query.sql
CREATE UNIQUE INDEX [index_name]
ON table_name (column1[, column2, ...])
[ NULLS [ NOT ] DISTINCT ];

Sintaksis tushuntirishi:

  • CREATE UNIQUE INDEX — noyob indeks yaratish buyrug'i.
  • index_name — indeks nomi (ko'rsatilmasa avtomatik shakllanadi).
  • table_name (column1, ...) — jadval va indekslanayotgan ustunlar ro'yxati.
  • NULLS DISTINCT (sukut bo'yicha) — har bir NULL qiymatini alohida va farqli qiymat deb hisoblaydi. Bu shuni anglatadiki, ustunda bir nechta NULL qiymatlar saqlanishi mumkin.
  • NULLS NOT DISTINCT (PostgreSQL 15+) — barcha NULL qiymatlarni teng deb hisoblaydi va bittadan ortiq NULL kiritilishiga yo'l qo'ymaydi.

UNIQUE INDEX amaliy misollari

1) Bitta ustun bo'yicha noyob indeks yaratish

Avval ombor xodimlari jadvalini yaratamiz:

query.sql
DROP TABLE IF EXISTS warehouse_workers CASCADE;

CREATE TABLE warehouse_workers (
  id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255),
  phone VARCHAR(25),
  extension VARCHAR(25)
);

Endi email ustuniga noyob indeks o'rnatamiz:

query.sql
CREATE UNIQUE INDEX ON warehouse_workers (email);

Ushbu indeks warehouse_workers_email_idx nomini oladi va elektron pochta manzillari takrorlanmasligini nazorat qiladi.

Birinchi xodimni qo'shamiz:

query.sql
INSERT INTO warehouse_workers (name, email, phone, extension)
VALUES ('Emma Smith', 'emma.smith@example.com', '(408)-111-2222', '101');

Endi aynan shu email manzili bilan boshqa xodim qo'shishga urinib ko'ramiz:

query.sql
INSERT INTO warehouse_workers (name, email, phone, extension)
VALUES ('Emma Scott', 'emma.smith@example.com', '(408)-111-2222', '102');

PostgreSQL qoidabuzarlik haqida xatolik chiqaradi:

matn
ERROR:  duplicate key value violates unique constraint "warehouse_workers_email_idx"
DETAIL:  Key (email)=(emma.smith@example.com) already exists.

2) Bir nechta ustunlar kombinatsiyasida noyob indeks yaratish

Ba'zan alohida ustunlar takrorlanishi mumkin, biroq ularning juftligi noyob bo'lishi kerak. Masalan, bir nechta xodim bir xil umumiy telefon raqamiga (phone) ega bo'lishi mumkin, lekin ularning ichki qisqa raqamlari (extension) har xil bo'lishi lozim:

query.sql
CREATE UNIQUE INDEX ON warehouse_workers (phone, extension);

Endi quyidagi ma'lumotni kiritamiz:

query.sql
INSERT INTO warehouse_workers (name, email, phone, extension)
VALUES ('Mary Scott', 'mary.scott@example.com', '(408)-111-2222', '102');

Emma Smith bilan telefon bir xil bo'lsa ham, extension boshqa (102 != 101) bo'lgani uchun qator muvaffaqiyatli qo'shiladi.

Biroq, aynan shu (408)-111-2222 va 102 juftligi bilan boshqa xodim qo'shilsa:

query.sql
INSERT INTO warehouse_workers (name, email, phone, extension)
VALUES ('Ava Garcia', 'ava.garcia@example.com', '(408)-111-2222', '102');

PostgreSQL xatolik chiqaradi:

matn
ERROR:  duplicate key value violates unique constraint "warehouse_workers_phone_extension_idx"
DETAIL:  Key (phone, extension)=((408)-111-2222, 102) already exists.

UNIQUE INDEX va PRIMARY KEY o'rtasidagi farq

PostgreSQLda birlamchi kalit (PRIMARY KEY) aslida maxsus noyob indeks hisoblanadi:

  • Jadvalda faqatgina bitta PRIMARY KEY bo'lishi mumkin, ammo bir nechta UNIQUE INDEX yaratish mumkin.
  • PRIMARY KEY ustunlariga NULL kiritish qat'iyan taqiqlanadi.
  • UNIQUE INDEX esa sukut bo'yicha NULL qiymatlarga ruxsat beradi (agar ustunda NOT NULL cheklovi yoki NULLS NOT DISTINCT ko'rsatilmagan bo'lsa).

Xulosa

  • UNIQUE INDEX ustun yoki ustunlar kombinatsiyasida ma'lumotlar takrorlanmasligini nazorat qiladi va qidiruvni tezlashtiradi.
  • Tarkibiy noyob indeks bir nechta maydonlar juftligining yagonaligini kafolatlaydi.
  • PostgreSQL 15 dan boshlab NULLS NOT DISTINCT opsiyasi orqali NULL qiymatlarning ham takrorlanishini cheklash mumkin.