Noyob indekslar
Ushbu qo'llanmada PostgreSQLda jadvalning bitta yoki bir nechta ustunlarida qiymatlar takrorlanmasligini (noyobligini) kafolatlash uchun UNIQUE INDEX dan qanday foydalanishni o'rganasiz.
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:
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.Avval ombor xodimlari jadvalini yaratamiz:
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:
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:
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:
INSERT INTO warehouse_workers (name, email, phone, extension)
VALUES ('Emma Scott', 'emma.smith@example.com', '(408)-111-2222', '102');
PostgreSQL qoidabuzarlik haqida xatolik chiqaradi:
ERROR: duplicate key value violates unique constraint "warehouse_workers_email_idx"
DETAIL: Key (email)=(emma.smith@example.com) already exists.
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:
CREATE UNIQUE INDEX ON warehouse_workers (phone, extension);
Endi quyidagi ma'lumotni kiritamiz:
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:
INSERT INTO warehouse_workers (name, email, phone, extension)
VALUES ('Ava Garcia', 'ava.garcia@example.com', '(408)-111-2222', '102');
PostgreSQL xatolik chiqaradi:
ERROR: duplicate key value violates unique constraint "warehouse_workers_phone_extension_idx"
DETAIL: Key (phone, extension)=((408)-111-2222, 102) already exists.
PostgreSQLda birlamchi kalit (PRIMARY KEY) aslida maxsus noyob indeks hisoblanadi:
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).UNIQUE INDEX ustun yoki ustunlar kombinatsiyasida ma'lumotlar takrorlanmasligini nazorat qiladi va qidiruvni tezlashtiradi.NULLS NOT DISTINCT opsiyasi orqali NULL qiymatlarning ham takrorlanishini cheklash mumkin.