Bosh sahifa Wiki Unique index

Unique index

Unique index — indekslangan kalit qiymati jadvalda takrorlanmasligini ta’minlaydigan database indeksidir. U qidiruvni tezlashtirish bilan birga data integrity constraint vazifasini bajaradi. Bitta ustun yoki bir nechta ustundan tuzilgan composite key unique bo‘lishi mumkin.

Noyoblik tekshiruvi

Insert yoki update vaqtida database yangi kalit mavjud yozuv bilan to‘qnashmasligini tekshiradi. To‘qnashuv bo‘lsa statement unique violation bilan rad etiladi. Tekshiruv applicationdagi “avval qidir, keyin yoz” ketma-ketligidan xavfsizroq, chunki parallel transactionlar orasidagi race’ni database hal qiladi.

CREATE UNIQUE INDEX users_email_uq
ON users (lower(email));

Expression index emailni kichik harfga keltirib, registrdan qat’i nazar noyoblik beradi. Collation va Unicode normalization talabi ham aniq belgilanadi; faqat lower barcha xalqaro identifikator qoidalarini to‘liq yechmaydi.

NULL semantikasi

SQL standartlari va database implementatsiyasiga ko‘ra NULL noma’lum qiymatni bildiradi. Ko‘p tizimlar unique indeksda bir nechta NULLga ruxsat beradi, chunki ular o‘zaro teng deb qabul qilinmaydi. Ayrim engine NULLS NOT DISTINCT kabi variant bilan nullarni ham bitta qiymat deb tekshiradi.

Composite unique indeksda (tenant_id, external_id) juftligi noyob bo‘ladi. Ustunlardan biri null bo‘lsa kutilgan constraint ishlamasligi mumkin. Domain talabi nullability bilan birga test qilinadi.

Constraint va indeks

UNIQUE constraint ko‘pincha ichkarida unique indeks bilan bajariladi. Constraint data modelining biznes qoidasini ifodalaydi va foreign key targeti bo‘lishi mumkin. Bevosita unique index esa expression yoki partial predicate kabi engine-specific imkoniyatlarni beradi.

Migration vositasi constraint yaratgan indeksni alohida oddiy indeks deb ko‘rmasligi kerak. Uni drop qilish constraintni buzishi mumkin. Metadata orqali ownership va dependency tekshiriladi.

Parallel yozuvlar

Ikki transaction bir xil kalitni yozsa ulardan biri kutishi mumkin. Birinchisi commit qilsa ikkinchisi violation oladi; rollback qilsa ikkinchisi davom etishi mumkin. Isolation va engine locking mexanizmi natijani belgilaydi.

INSERT ... ON CONFLICT unique indeksni conflict arbiter sifatida ishlatib idempotent upsert bajaradi. Conflict target aynan kerakli constraintga mos bo‘lishi zarur. Upsert ham business operationni to‘liq exactly-once qilmaydi; tashqi side effectlar alohida boshqariladi.

Partial noyoblik

Soft delete ishlatilganda faqat faol yozuvlar orasida noyoblik kerak bo‘lishi mumkin:

CREATE UNIQUE INDEX active_username_uq
ON accounts (username)
WHERE deleted_at IS NULL;

O‘chirilgan yozuv tarixda qoladi, yangi active account shu username’ni olishi mumkin. Query va update predicate bilan bir xil semantikani saqlashi kerak.

Migration va mavjud duplicate

Mavjud jadvalga unique indeks yaratishdan oldin duplicate kalitlar topiladi. Qaysi yozuv authoritative ekani biznes qoidasi bilan hal qilinadi; tasodifiy bittasini o‘chirish referential bog‘lanishni buzishi mumkin.

Katta jadvalda unique indeks qurilishi uzoq davom etadi va write’lar bilan to‘qnashadi. Concurrent yoki online build availabilityni saqlaydi, lekin qurilish yakunida parallel o‘zgarishlar ham tekshiriladi. Failed builddan qolgan invalid indeks olib tashlanadi.

Deferrable tekshiruv

Ayrim database unique constraintni statement oxirida emas, transaction commitida tekshirishga imkon beradi. Bu ikki satrning noyob kalitlarini vaqtincha almashtirish kabi operatsiyada foydali. Oraliq holatda duplicate mavjud bo‘lsa ham yakuniy holat noyob qoladi. Deferrable constraint concurrency va xotira xarajatiga ega hamda bevosita unique index bilan har doim bir xil imkoniyat bermaydi. Application transaction chegarasini aniq saqlashi kerak.

Bog‘liq tushunchalar

Unique constraint, Composite index, Partial index, NULL, Upsert, Data integrity, Transaction isolation