3-bo‘lim
Ma'lumot turlari va jadval yaratish
Son, matn, sana turlari, cheklovlar (NOT NULL, UNIQUE, DEFAULT), birlamchi kalit va jadvalni o'zgartirish.
Ushbu bo‘lim mundarijasi
Jadval yaratishdan oldin har bir ustun qanday ma'lumot saqlashini aniqlash kerak. To'g'ri tur tanlash bazani tez va ishonchli qiladi.
Son turlari #
| Tur | Diapazon | Hajmi | Qachon |
|---|---|---|---|
TINYINT | -128 ... 127 | 1 bayt | Yosh, holat |
SMALLINT | -32 768 ... 32 767 | 2 bayt | Yil, miqdor |
MEDIUMINT | ±8 million | 3 bayt | O'rta hajm |
INT | ±2.1 milliard | 4 bayt | Standart tanlov, id |
BIGINT | ±9.2 kvintillion | 8 bayt | Juda katta sonlar |
DECIMAL(m,d) | Aniq kasr | o'zgaruvchan | Pul, foiz |
FLOAT | Taxminiy kasr | 4 bayt | Ilmiy o'lchov |
DOUBLE | Taxminiy kasr | 8 bayt | Ilmiy o'lchov |
CREATE TABLE mahsulotlar (
id INT AUTO_INCREMENT PRIMARY KEY,
soni SMALLINT UNSIGNED, -- faqat musbat, 0-65535
narx DECIMAL(12,2), -- 12 ta raqam, 2 tasi kasrda
reyting DECIMAL(2,1) -- 0.0 dan 9.9 gacha
);
FLOAT ishlatmang-- XATO
narx FLOAT;
-- TO'G'RI
narx DECIMAL(12,2);
FLOAT va DOUBLE sonlarni taxminiy saqlaydi. 0.1 + 0.2 natijasi 0.30000000000000004
bo'lishi mumkin. Moliyaviy hisob-kitobda bu qabul qilinmaydi.
DECIMAL esa sonni aniq saqlaydi - u pul uchun yagona to'g'ri tanlov.
UNSIGNED - ikki barobar diapazonManfiy qiymat kerak bo'lmasa (yosh, miqdor, id), UNSIGNED qo'shing.
INT diapazoni 2.1 milliarddan 4.2 milliardga oshadi va manfiy qiymat
kiritish imkonsiz bo'ladi - bu qo'shimcha himoya.
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
soni SMALLINT UNSIGNED NOT NULL DEFAULT 0
Matn turlari #
| Tur | Maksimal uzunlik | Qachon |
|---|---|---|
CHAR(n) | 255, qat'iy | Kod, qisqartma (UZ, M/F) |
VARCHAR(n) | 65 535, o'zgaruvchan | Ism, email, sarlavha |
TINYTEXT | 255 | Kamdan-kam |
TEXT | 65 535 (~64 KB) | Izoh, tavsif |
MEDIUMTEXT | 16 MB | Maqola, kitob |
LONGTEXT | 4 GB | Juda katta matn |
CREATE TABLE maqolalar (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
til_kodi CHAR(2), -- har doim 2 ta belgi: 'uz', 'ru'
sarlavha VARCHAR(200) NOT NULL,
qisqacha VARCHAR(500),
matn MEDIUMTEXT
);
CHAR va VARCHAR farqiCHAR(10)da"uz"saqlansa ham 10 bayt egallaydi (bo'shliq bilan to'ldiriladi).VARCHAR(10)da"uz"faqat 3 bayt egallaydi (2 + uzunlik belgisi).
CHAR uzunligi doim bir xil bo'lgan qiymatlar uchun (mamlakat kodi, jins).
Qolgan hamma holatda VARCHAR.
VARCHAR(255) odatiKo'p dasturchi har bir matn ustuniga VARCHAR(255) yozadi. Bu xato emas, lekin
uzunlik haqiqiy chegarani aks ettirishi kerak:
email VARCHAR(190) -- indeks uchun 191 belgi chegarasi bor
telefon VARCHAR(20) -- +998901234567 ga yetadi
til_kodi CHAR(2) -- aniq 2 ta
Uzunlik cheklovi - bu ham ma'lumot to'g'riligini himoya qilish usuli.
Sana va vaqt #
| Tur | Format | Diapazon |
|---|---|---|
DATE | YYYY-MM-DD | 1000-01-01 ... 9999-12-31 |
TIME | HH:MM:SS | -838:59:59 ... 838:59:59 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000 ... 9999 yil |
TIMESTAMP | Sana + vaqt | 1970 ... 2038 yil |
YEAR | YYYY | 1901 ... 2155 |
CREATE TABLE hodisalar (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nomi VARCHAR(160) NOT NULL,
tugilgan_sana DATE,
boshlanish DATETIME,
yaratilgan TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
yangilangan TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
yaratilgan va yangilangan ustunlariBu ikki qator deyarli har bir jadvalda bo'lishi kerak:
yaratilgan TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
yangilangan TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Ular avtomatik to'ldiriladi va "bu yozuv qachon qo'shilgan / oxirgi marta o'zgargan" degan savolga javob beradi. Nosozlikni tuzatishda bebaho.
TIMESTAMP 2038-yil muammosiTIMESTAMP 4 baytda saqlanadi va 2038-yil 19-yanvarda to'lib qoladi.
Kelajakdagi sanalar (tug'ilgan kun, muddat) uchun DATETIME ishlating.
TIMESTAMP ning afzalligi - u vaqt zonasini hisobga oladi va yozuv vaqtini
saqlash uchun ideal.
Boshqa turlar #
CREATE TABLE misol (
-- Cheklangan variantlar
holat ENUM('yangi', 'jarayonda', 'tugallandi') DEFAULT 'yangi',
-- Bir nechta variantni birga
teglar SET('muhim', 'shoshilinch', 'arxiv'),
-- Mantiqiy (aslida TINYINT(1))
faolmi BOOLEAN DEFAULT TRUE,
-- JSON ma'lumot (MySQL 5.7+)
sozlama JSON,
-- Ikkilik ma'lumot
rasm BLOB
);
BLOB da rasm saqlamangRasmni bazaga solish mumkin, lekin tavsiya etilmaydi:
- Baza hajmi keskin oshadi
- Zaxira nusxa sekinlashadi
- Keshlash qiyinlashadi
To'g'ri yondashuv: rasmni fayl tizimida saqlang, bazada faqat yo'lini:
rasm_yoli VARCHAR(255) -- 'rasmlar/2026/09/mahsulot-12.webp'
Cheklovlar (constraints) #
Cheklovlar bazaga "bu ma'lumot qanday bo'lishi kerak" deb aytadi.
| Cheklov | Vazifasi |
|---|---|
NOT NULL | Bo'sh bo'lmasin |
DEFAULT x | Ko'rsatilmasa x qo'yiladi |
UNIQUE | Takrorlanmasin |
PRIMARY KEY | Birlamchi kalit (noyob + NOT NULL) |
AUTO_INCREMENT | Avtomatik oshadi |
CHECK (shart) | Shart bajarilsin |
FOREIGN KEY | Boshqa jadvalga bog'lanish |
CREATE TABLE foydalanuvchilar (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(190) NOT NULL UNIQUE,
ism VARCHAR(120) NOT NULL,
yosh TINYINT UNSIGNED CHECK (yosh >= 14 AND yosh <= 120),
balans DECIMAL(12,2) NOT NULL DEFAULT 0.00,
rol ENUM('foydalanuvchi', 'muharrir', 'admin')
NOT NULL DEFAULT 'foydalanuvchi',
faolmi BOOLEAN NOT NULL DEFAULT TRUE,
yaratilgan TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
NULL nima?NULL - "qiymat yo'q" degani. U nol emas va bo'sh matn ham emas:
| Qiymat | Ma'nosi |
|---|---|
0 | Aniq nol |
'' | Bo'sh matn |
NULL | Noma'lum yoki mavjud emas |
Muhim: NULL bilan taqqoslash = orqali ishlamaydi:
WHERE telefon = NULL -- hech qachon rost bo'lmaydi
WHERE telefon IS NULL -- to'g'ri
Birlamchi kalit #
Har bir jadvalda birlamchi kalit bo'lishi kerak - qatorni yagona aniqlaydigan ustun.
-- 1-usul: avtomatik oshadigan son (eng keng tarqalgan)
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
-- 2-usul: tabiiy kalit
CREATE TABLE viloyatlar (
kodi CHAR(2) PRIMARY KEY, -- 'TS', 'SA', 'BU'
nomi VARCHAR(60) NOT NULL
);
-- 3-usul: tarkibiy kalit (ikki ustundan)
CREATE TABLE talaba_fan (
talaba_id INT UNSIGNED,
fan_id INT UNSIGNED,
baho TINYINT,
PRIMARY KEY (talaba_id, fan_id)
);
AUTO_INCREMENT afzal?Tabiiy kalit (masalan, email yoki passport raqami) mantiqan to'g'ri tuyuladi, lekin:
- U o'zgarishi mumkin (email almashtiriladi)
- U uzun bo'ladi (indeks katta bo'ladi)
- U maxfiy bo'lishi mumkin
Sun'iy id esa hech qachon o'zgarmaydi, kichik va ma'nosiz - aynan shuning uchun ishonchli.
Jadvalni to'liq yaratish #
CREATE TABLE IF NOT EXISTS talabalar (
id INT UNSIGNED AUTO_INCREMENT,
ism VARCHAR(120) NOT NULL,
familiya VARCHAR(120) NOT NULL,
email VARCHAR(190) NOT NULL,
tugilgan_sana DATE,
shahar VARCHAR(60),
kurs TINYINT UNSIGNED CHECK (kurs BETWEEN 1 AND 6),
ortacha_baho DECIMAL(3,2) DEFAULT 0.00,
faolmi BOOLEAN NOT NULL DEFAULT TRUE,
yaratilgan TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
yangilangan TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uq_email (email),
KEY idx_shahar (shahar),
KEY idx_kurs (kurs)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
| Qism | Vazifasi |
|---|---|
IF NOT EXISTS | Jadval bor bo'lsa xato bermaydi |
PRIMARY KEY | Birlamchi kalit |
UNIQUE KEY | Takrorlanmaydigan ustun |
KEY | Oddiy indeks (tez qidiruv uchun) |
ENGINE=InnoDB | Tranzaksiya va tashqi kalitlarni qo'llab-quvvatlaydi |
CHARSET=utf8mb4 | Barcha Unicode belgilari |
ENGINE=InnoDB ni ko'rsatingMySQL da ikkita asosiy dvigatel bor:
| InnoDB | MyISAM | |
|---|---|---|
| Tranzaksiyalar | Ha | Yo'q |
| Tashqi kalitlar | Ha | Yo'q |
| Qator darajasida bloklash | Ha | Yo'q (butun jadval) |
| Buzilishdan tiklanish | Ha | Zaif |
Zamonaviy MySQL da InnoDB standart, lekin uni aniq yozish yaxshi odat. MyISAM bugungi kunda deyarli ishlatilmaydi.
Jadvalni o'zgartirish #
-- Ustun qo'shish
ALTER TABLE talabalar ADD COLUMN telefon VARCHAR(20);
ALTER TABLE talabalar ADD COLUMN izoh TEXT AFTER shahar;
-- Ustun turini o'zgartirish
ALTER TABLE talabalar MODIFY COLUMN ism VARCHAR(150) NOT NULL;
-- Ustun nomini o'zgartirish
ALTER TABLE talabalar CHANGE COLUMN shahar viloyat VARCHAR(60);
-- Ustunni o'chirish
ALTER TABLE talabalar DROP COLUMN izoh;
-- Indeks qo'shish
ALTER TABLE talabalar ADD INDEX idx_familiya (familiya);
-- Jadval nomini o'zgartirish
RENAME TABLE talabalar TO oquvchilar;
-- Jadvalni tozalash (tuzilma qoladi)
TRUNCATE TABLE talabalar;
-- Jadvalni butunlay o'chirish
DROP TABLE IF EXISTS talabalar;
TRUNCATE va DELETE farqiDELETE FROM talabalar; -- qatorlarni birma-bir o'chiradi, qaytarish mumkin
TRUNCATE TABLE talabalar; -- jadvalni butunlay tozalaydi, TEZ, qaytarib bo'lmaydi
TRUNCATE AUTO_INCREMENT hisoblagichini ham nolga qaytaradi.
Ishlab chiqarish serverida ehtiyot bo'ling.
To'liq amaliy misol #
CREATE DATABASE IF NOT EXISTS maktab
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE maktab;
CREATE TABLE guruhlar (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nomi VARCHAR(20) NOT NULL UNIQUE,
yil YEAR NOT NULL,
yaratilgan TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE talabalar (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
guruh_id INT UNSIGNED,
ism VARCHAR(120) NOT NULL,
familiya VARCHAR(120) NOT NULL,
email VARCHAR(190) NOT NULL UNIQUE,
telefon VARCHAR(20),
tugilgan_sana DATE,
shahar VARCHAR(60),
ortacha_baho DECIMAL(3,2) DEFAULT 0.00,
faolmi BOOLEAN NOT NULL DEFAULT TRUE,
yaratilgan TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
yangilangan TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY idx_guruh (guruh_id),
KEY idx_shahar (shahar)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO guruhlar (nomi, yil) VALUES
('IT-101', 2026),
('IT-102', 2026),
('DIZ-201', 2025);
INSERT INTO talabalar (guruh_id, ism, familiya, email, shahar, ortacha_baho) VALUES
(1, 'Husanboy', 'Qodirov', '[email protected]', 'Namangan', 4.60),
(1, 'Sardor', 'Aliyev', '[email protected]', 'Toshkent', 3.80),
(2, 'Malika', 'Yusupova', '[email protected]', 'Buxoro', 4.90),
(2, 'Bekzod', 'Rasulov', '[email protected]', 'Toshkent', 3.20),
(3, 'Nodira', 'Sobirova', '[email protected]', 'Samarqand', 4.30);
SELECT * FROM talabalar;
kutubxona bazasi uchun to'liq tuzilma yarating:
mualliflarjadvali:id,ism,tugilgan_yil,mamlakat.kitoblarjadvali:id,muallif_id,nomi,yil,sahifalar,narx,mavjudmi.- Narx uchun to'g'ri turni tanlang (
DECIMAL). nomiustunigaNOT NULL,yilgaCHECKcheklovini qo'ying.- Ikkala jadvalda ham
yaratilganvayangilanganustunlari bo'lsin. ENGINE=InnoDBvautf8mb4ni ko'rsating.ALTER TABLEbilankitoblargajanr VARCHAR(60)ustunini qo'shing.DESCRIBEbilan natijani tekshiring.
Xulosa #
- Son uchun
INT, pul uchunDECIMAL(hech qachonFLOATemas). - Matn uchun
VARCHAR, uzun matn uchunTEXT; uzunlikni haqiqiy chegaraga qarab bering. - Sana uchun
DATE, vaqt bilanDATETIME;TIMESTAMP2038-yilda tugaydi. NULLnol ham, bo'sh matn ham emas -IS NULLbilan tekshiriladi.- Har bir jadvalda birlamchi kalit bo'lsin, odatda
INT AUTO_INCREMENT. NOT NULL,UNIQUE,DEFAULT,CHECK- ma'lumot to'g'riligini baza darajasida himoya qiladi.ENGINE=InnoDBvautf8mb4ni har doim ko'rsating.yaratilganvayangilanganustunlari deyarli har bir jadvalda foydali.
Keyingi bo'limda ma'lumot qo'shishni batafsil o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.