Yagonalik cheklovi
Kirish: Ushbu darsda siz jadvalning bitta yoki bir nechta ustunlarida qiymatlarning takrorlanmasligini (yagonaligini) ta'minlash uchun PostgreSQL UNIQUE cheklovidan qanday foydalanishni hamda NULL qiymatlarning yagonalikka ta'sirini o'rganasiz.
UNIQUE (yagonalik) cheklovi jadvaldagi bitta ustun yoki ustunlar birikmasidagi barcha qiymatlarning butun jadval bo'ylab mutlaqo takrorlanmasligini ta'minlaydi.
Agar siz UNIQUE ustuniga bazada allaqachon mavjud bo'lgan qiymatni kiritishga (INSERT) yoki o'zgartirishga (UPDATE) urinsangiz, PostgreSQL qoidabuzarlik xatoligini chiqaradi va amaliyotni bekor qiladi.
Masalan, foydalanuvchilarning elektron pochta manzillari (email), telefon raqamlari (phone) yoki tovarlarning brend nomlari (name) takrorlanmasligi kerak bo'lsa, UNIQUE cheklovi qo'yiladi.
Cheklovga o'zingiz nom berishingiz mumkin:
CREATE TABLE jadval_nomi (
ustun1 data_type CONSTRAINT cheklov_nomi UNIQUE,
...
);
Agar CONSTRAINT cheklov_nomi qismini yozmasangiz, PostgreSQL avtomatik ravishda quyidagi shablon bo'yicha nom beradi:
{jadval_nomi}_{ustun_nomi}_key
Oddiy va eng ko'p ishlatiladigan qisqa sintaksis:
CREATE TABLE jadval_nomi (
ustun1 data_type UNIQUE,
...
);
Agar betakrorlik ikki yoki undan ortiq ustunlarning birikmasiga tegishli bo'lsa, u jadval darajasida belgilanadi:
CREATE TABLE jadval_nomi (
ustun1 data_type,
ustun2 data_type,
...
CONSTRAINT cheklov_nomi UNIQUE (ustun1, ustun2)
);
Bu holatda alohida ustun1 yoki ustun2 takrorlanishi mumkin, ammo ularning birgalikdagi juftligi takrorlanmasligi shart.
Brendlar nomi takrorlanmasligi uchun brands jadvalini yaratamiz:
CREATE TABLE brands (
brand_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(255) NOT NULL UNIQUE
);
Jadvalga 'Apple' brendini qo'shamiz:
INSERT INTO brands (name)
VALUES ('Apple')
RETURNING *;
Natija:
| brand_id | name |
|---|---|
| 1 | Apple |
Endi yana qaytadan xuddi shu 'Apple' brendini kiritishga urinamiz:
INSERT INTO brands (name)
VALUES ('Apple')
RETURNING *;
PostgreSQL qaytargan xatolik:
ERROR: duplicate key value violates unique constraint "brands_name_key"
PostgreSQL takroriy brend kiritilishiga yo'l qo'ymadi va ma'lumotlar yaxlitligini saqlab qoldi!
Tovarlarni xodimlarga vaqtincha biriktirish (product_loans) jadvalini yaratamiz. Unda bir xil mahsulotni bir vaqtning o'zida bir xil foydalanuvchiga ikki marta berib bo'lmasligi uchun (product_id, user_id) juftligiga UNIQUE qo'yamiz:
CREATE TABLE product_loans (
loan_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
product_id INT NOT NULL,
user_id INT NOT NULL,
loan_date DATE NOT NULL,
return_date DATE,
UNIQUE (product_id, user_id)
);
Dastlab ikkita har xil juftlik kiritamiz:
INSERT INTO product_loans (product_id, user_id, loan_date)
VALUES
(1, 1, '2026-09-20'),
(1, 2, '2026-09-20')
RETURNING *;
Ikkala qator ham muvaffaqiyatli saqlandi. Endi mavjud bo'lgan (1, 1) juftligini yana kiritishga urinamiz:
INSERT INTO product_loans (product_id, user_id, loan_date)
VALUES (1, 1, '2026-09-21');
Xatolik:
ERROR: duplicate key value violates unique constraint "product_loans_product_id_user_id_key"
Juda muhim qoida: PostgreSQLda NULL qiymati boshqa bir NULL qiymatiga teng emas deb qaraladi (chunki har bir NULL — bu alohida noma'lumlikdir).
Shu sababli, agar ustunda NOT NULL cheklovi bo'lmasa, UNIQUE chekloviga ega ustunga istalgancha ko'p NULL qiymat kiritish mumkin!
Masalan, foydalanuvchilar profillari (profiles) jadvalini yarataylik:
CREATE TABLE profiles (
user_id INT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
phone VARCHAR(25) UNIQUE
);
Birinchi foydalanuvchini telefon raqamisiz (NULL) kiritamiz:
INSERT INTO profiles (user_id, first_name, last_name, phone)
VALUES (1, 'Ali', 'Valiyev', NULL)
RETURNING *;
Endi ikkinchi foydalanuvchini ham telefon raqamisiz (NULL) kiritamiz:
INSERT INTO profiles (user_id, first_name, last_name, phone)
VALUES (2, 'Hasan', 'Husanov', NULL)
RETURNING *;
Ikkala qator ham xatosiz saqlandi! Chunki ularning telefon raqami noma'lum deb qaraladi va bu yagonalik qoidasini buzmaydi.
[!TIP] Agar siz ustunda
NULLham takrorlanmasligini (ya'ni yoki bitta aniq telefon raqami bo'lsin, yoki faqat 1 kishi raqamsiz bo'lsin) yoki umumanNULLbo'lmasligini xohlasangiz, ustunga bir vaqtning o'zida hamNOT NULL, hamUNIQUEcheklovlarini birga qo'yishingiz kerak!
UNIQUE cheklovi ustun yoki ustunlar birikmasidagi qiymatlar betakror bo'lishini ta'minlaydi.{jadval}_{ustun}_key nomini beradi.UNIQUE ustuni bir nechta NULL qiymatlarni qabul qila oladi (chunki NULL != NULL).