3-bo‘lim

Ma'lumot turlari va jadval yaratish

Son, matn, sana turlari, cheklovlar (NOT NULL, UNIQUE, DEFAULT), birlamchi kalit va jadvalni o'zgartirish.

🕑 13 daqiqa o‘qish 📄 1 026 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Son turlari
  2. Matn turlari
  3. Sana va vaqt
  4. Boshqa turlar
  5. Cheklovlar (constraints)
  6. Birlamchi kalit
  7. Jadvalni to'liq yaratish
  8. Jadvalni o'zgartirish
  9. To'liq amaliy misol
  10. Xulosa

Jadval yaratishdan oldin har bir ustun qanday ma'lumot saqlashini aniqlash kerak. To'g'ri tur tanlash bazani tez va ishonchli qiladi.

Son turlari #

TurDiapazonHajmiQachon
TINYINT-128 ... 1271 baytYosh, holat
SMALLINT-32 768 ... 32 7672 baytYil, miqdor
MEDIUMINT±8 million3 baytO'rta hajm
INT±2.1 milliard4 baytStandart tanlov, id
BIGINT±9.2 kvintillion8 baytJuda katta sonlar
DECIMAL(m,d)Aniq kasro'zgaruvchanPul, foiz
FLOATTaxminiy kasr4 baytIlmiy o'lchov
DOUBLETaxminiy kasr8 baytIlmiy o'lchov
SQL
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
);
Pul uchun FLOAT ishlatmang
SQL
-- 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 diapazon

Manfiy 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.

SQL
id   INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
soni SMALLINT UNSIGNED NOT NULL DEFAULT 0

Matn turlari #

TurMaksimal uzunlikQachon
CHAR(n)255, qat'iyKod, qisqartma (UZ, M/F)
VARCHAR(n)65 535, o'zgaruvchanIsm, email, sarlavha
TINYTEXT255Kamdan-kam
TEXT65 535 (~64 KB)Izoh, tavsif
MEDIUMTEXT16 MBMaqola, kitob
LONGTEXT4 GBJuda katta matn
SQL
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 farqi
  • CHAR(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) odati

Ko'p dasturchi har bir matn ustuniga VARCHAR(255) yozadi. Bu xato emas, lekin uzunlik haqiqiy chegarani aks ettirishi kerak:

SQL
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 #

TurFormatDiapazon
DATEYYYY-MM-DD1000-01-01 ... 9999-12-31
TIMEHH:MM:SS-838:59:59 ... 838:59:59
DATETIMEYYYY-MM-DD HH:MM:SS1000 ... 9999 yil
TIMESTAMPSana + vaqt1970 ... 2038 yil
YEARYYYY1901 ... 2155
SQL
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 ustunlari

Bu ikki qator deyarli har bir jadvalda bo'lishi kerak:

SQL
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 muammosi

TIMESTAMP 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 #

SQL
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 saqlamang

Rasmni 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:

SQL
rasm_yoli VARCHAR(255)     -- 'rasmlar/2026/09/mahsulot-12.webp'

Cheklovlar (constraints) #

Cheklovlar bazaga "bu ma'lumot qanday bo'lishi kerak" deb aytadi.

CheklovVazifasi
NOT NULLBo'sh bo'lmasin
DEFAULT xKo'rsatilmasa x qo'yiladi
UNIQUETakrorlanmasin
PRIMARY KEYBirlamchi kalit (noyob + NOT NULL)
AUTO_INCREMENTAvtomatik oshadi
CHECK (shart)Shart bajarilsin
FOREIGN KEYBoshqa jadvalga bog'lanish
SQL
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:

QiymatMa'nosi
0Aniq nol
''Bo'sh matn
NULLNoma'lum yoki mavjud emas

Muhim: NULL bilan taqqoslash = orqali ishlamaydi:

SQL
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.

SQL
-- 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)
);
Nima uchun 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 #

SQL
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;
QismVazifasi
IF NOT EXISTSJadval bor bo'lsa xato bermaydi
PRIMARY KEYBirlamchi kalit
UNIQUE KEYTakrorlanmaydigan ustun
KEYOddiy indeks (tez qidiruv uchun)
ENGINE=InnoDBTranzaksiya va tashqi kalitlarni qo'llab-quvvatlaydi
CHARSET=utf8mb4Barcha Unicode belgilari
ENGINE=InnoDB ni ko'rsating

MySQL da ikkita asosiy dvigatel bor:

InnoDBMyISAM
TranzaksiyalarHaYo'q
Tashqi kalitlarHaYo'q
Qator darajasida bloklashHaYo'q (butun jadval)
Buzilishdan tiklanishHaZaif

Zamonaviy MySQL da InnoDB standart, lekin uni aniq yozish yaxshi odat. MyISAM bugungi kunda deyarli ishlatilmaydi.

Jadvalni o'zgartirish #

SQL
-- 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 farqi
SQL
DELETE 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 #

SQL
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;
Amaliy topshiriq

kutubxona bazasi uchun to'liq tuzilma yarating:

  1. mualliflar jadvali: id, ism, tugilgan_yil, mamlakat.
  2. kitoblar jadvali: id, muallif_id, nomi, yil, sahifalar, narx, mavjudmi.
  3. Narx uchun to'g'ri turni tanlang (DECIMAL).
  4. nomi ustuniga NOT NULL, yil ga CHECK cheklovini qo'ying.
  5. Ikkala jadvalda ham yaratilgan va yangilangan ustunlari bo'lsin.
  6. ENGINE=InnoDB va utf8mb4 ni ko'rsating.
  7. ALTER TABLE bilan kitoblar ga janr VARCHAR(60) ustunini qo'shing.
  8. DESCRIBE bilan natijani tekshiring.

Xulosa #

  • Son uchun INT, pul uchun DECIMAL (hech qachon FLOAT emas).
  • Matn uchun VARCHAR, uzun matn uchun TEXT; uzunlikni haqiqiy chegaraga qarab bering.
  • Sana uchun DATE, vaqt bilan DATETIME; TIMESTAMP 2038-yilda tugaydi.
  • NULL nol ham, bo'sh matn ham emas - IS NULL bilan 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=InnoDB va utf8mb4 ni har doim ko'rsating.
  • yaratilgan va yangilangan ustunlari deyarli har bir jadvalda foydali.

Keyingi bo'limda ma'lumot qo'shishni batafsil o'rganamiz.

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.