Asosiy kalit
Kirish: Ushbu darsda siz ma'lumotlar bazasida asosiy kalit (primary key) nima ekanligini, nima uchun kerakligini va PostgreSQLda PRIMARY KEY cheklovi yordamida avto-inkrementli hamda murakkab (kompozit) kalitlarni qanday yaratishni o'rganasiz.
Asosiy kalit (Primary Key) — bu jadvaldagi har bir qatorni bir-biridan yagona va betakror qilib ajratib turuvchi bitta ustun yoki ustunlar guruhidir. U jadvalda hech qachon bir xil qiymatga ega ikkita qator bo'lmasligini kafolatlaydi.
Masalan, quyidagi brands jadvalini ko'rib chiqaylik:
| brand_id | name |
|---|---|
| 1 | Apple |
| 2 | Samsung |
| 3 |
Bu jadvalda brand_id ustuni asosiy kalit vazifasini bajaradi: 1 raqami Apple brendini, 2 raqami Samsungni, 3 raqami esa Googleni bir ma'noli ifodalaydi. brand_id ustunida hech qachon takrorlanuvchi raqamlar bo'lishi mumkin emas.
PostgreSQLda asosiy kalitni belgilash uchun PRIMARY KEY cheklovidan (constraint) foydalaniladi.
Agar asosiy kalit bitta ustundan iborat bo'lsa, uni to'g'ridan-to'g'ri ustun turidan keyin PRIMARY KEY kalit so'zlari bilan yozish mumkin:
CREATE TABLE jadval_nomi (
ustun1 data_type PRIMARY KEY,
ustun2 data_type,
ustun3 data_type,
...
);
Bu yerda ustun1 jadvalning asosiy kaliti hisoblanadi.
Agar asosiy kalit ikki yoki undan ortiq ustunlar birikmasidan tashkil topsa, u jadval darajasidagi cheklov sifatida quyidagicha e'lon qilinadi:
CREATE TABLE jadval_nomi (
ustun1 data_type,
ustun2 data_type,
ustun3 data_type,
...
PRIMARY KEY (ustun1, ustun2)
);
Bunday kalit kompozit asosiy kalit (composite primary key) deyiladi. Bu holatda jadvaldagi hech qaysi ikki qatorda ustun1 va ustun2 juftligi bir xil bo'lishi mumkin emas.
Agar jadval avval yaratilgan bo'lsa va unda asosiy kalit belgilanmagan bo'lsa, ALTER TABLE buyrug'i orqali asosiy kalitni qo'shish mumkin:
ALTER TABLE jadval_nomi
ADD PRIMARY KEY (ustun1, ustun2, ...);
Amaliyotda asosiy kalitlar uchun ko'pincha avtomatik o'suvchi butun sonlar (1, 2, 3...) ishlatiladi. Bu ma'lumot kiritishda ID raqamini qo'lda yozish zaruratini yo'qotadi va betakrorlikni ta'minlaydi.
PostgreSQL zamonaviy SQL standartiga muvofiq avto-inkrement ustun yaratish uchun GENERATED ALWAYS AS IDENTITY atributidan foydalanadi:
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY
[!TIP] Eskirgan qo'llanmalarda
id SERIAL PRIMARY KEYsintaksisini ko'rishingiz mumkin. Ammo zamonaviy PostgreSQLdaGENERATED ALWAYS AS IDENTITYtavsiya etiladi, chunki u xavfsizroq, standartga mos va ruxsatlar bilan bog'liq noqulayliklarni keltirib chiqarmaydi.
brands jadvalini yaratamiz, unda brand_id avtomatik o'suvchi asosiy kalit bo'ladi:
CREATE TABLE brands (
brand_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(50)
);
brand_id avtomatik hosil bo'lishi sababli INSERT buyrug'ida unga qiymat berish shart emas, faqat name ni kiritamiz:
INSERT INTO brands (name)
VALUES ('Apple')
RETURNING *;
Natija:
| brand_id | name |
|---|---|
| 1 | Apple |
Endi yana yangi brend qo'shamiz:
INSERT INTO brands (name)
VALUES ('Samsung')
RETURNING *;
Natija:
| brand_id | name |
|---|---|
| 2 | Samsung |
PostgreSQL avtomatik ravishda keyingi betakror ID ni (2) taqdim etdi!
Ko'pga-ko'p munosabatini ifodalovchi product_tags jadvalini yaratamiz. Unda bitta mahsulotga bir xil tegni ikki marta berib bo'lmasligi uchun product_id va tag_id birgalikda asosiy kalit bo'ladi:
CREATE TABLE product_tags (
product_id INT,
tag_id INT,
PRIMARY KEY (product_id, tag_id)
);
Endi jadvalda bir xil product_id va bir xil tag_id ga ega qator faqat bir marta saqlanishi mumkin.
NULL) yoki takroriy qiymat qabul qilmaydi.INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY tavsiya etiladi.