ALTER TABLE — ustun qo'shish, o'zgartirish, o'chirish. DROP
Muammodan boshlaylik
Sayt 6 oy ishladi. Bazada 200 ming mijoz. Endi yangi talablar:
- Mijozlarning tug'ilgan kuni kerak — tabriklash uchun
telefonustuniVARCHAR(15)edi — xorijiy raqamlar sig'mayaptishaharustuniniviloyatdeb qayta nomlash kerak- Hech kim ishlatmaydigan
faksustunini olib tashlash kerak
Jadvalni o'chirib, qaytadan yaratib bo'lmaydi — 200 ming mijoz ma'lumoti bor. Mavjud jadval tuzilmasini ma'lumotni saqlagan holda o'zgartirish uchun — ALTER TABLE.
Ustun qo'shish
ALTER TABLE mijozlar ADD COLUMN tugilgan_kun DATE NULL;
Mavjud barcha qatorlarda yangi ustun NULL bo'ladi.
Joyini ko'rsatish:
ALTER TABLE mijozlar ADD COLUMN familiya VARCHAR(100) NULL AFTER ism;
ALTER TABLE mijozlar ADD COLUMN kod CHAR(8) NULL FIRST;
NOT NULL ustun qo'shish
ALTER TABLE mijozlar ADD COLUMN faol BOOLEAN NOT NULL;
Mavjud qatorlar uchun qiymat qayerdan olinadi? MySQL turning "nol" qiymatini qo'yadi (0, ''). Aniq qiymat berish uchun — DEFAULT:
ALTER TABLE mijozlar ADD COLUMN faol BOOLEAN NOT NULL DEFAULT TRUE;
Barcha mavjud mijozlar — faol.
Bir nechta o'zgarish bir buyruqda
ALTER TABLE mijozlar
ADD COLUMN tugilgan_kun DATE NULL,
ADD COLUMN jinsi ENUM('erkak', 'ayol') NULL,
ADD COLUMN reklama_rozi BOOLEAN NOT NULL DEFAULT FALSE;
Katta jadvalda bu alohida-alohida uchta ALTER dan ancha tez — jadval bir marta qayta quriladi.
Ustunni o'zgartirish
MODIFY — turini yoki cheklovini o'zgartirish
ALTER TABLE mijozlar MODIFY COLUMN telefon VARCHAR(30) NULL;
[!WARNING]
MODIFYustun ta'rifini to'liq almashtiradi. EskiNOT NULL,DEFAULT,COMMENTni yozmasangiz — ular yo'qoladi. AvvalSHOW CREATE TABLEbilan joriy ta'rifni ko'ring va to'liq qayta yozing.
RENAME COLUMN — faqat nomini o'zgartirish
ALTER TABLE mijozlar RENAME COLUMN shahar TO viloyat;
Turi va cheklovlari o'zgarmaydi. MySQL 8.0 dan.
CHANGE — nomi va turi birga
ALTER TABLE mijozlar CHANGE COLUMN viloyat hudud VARCHAR(80) NULL;
Eski MySQL versiyalarida nom o'zgartirishning yagona yo'li.
Turni toraytirish — xavfli
ALTER TABLE mahsulotlar MODIFY COLUMN nom VARCHAR(50) NOT NULL;
-- ERROR 1406: Data too long for column 'nom' at row 17
Strict mode da MySQL ma'lumotni qisqartirmaydi va xato beradi. Avval tekshiring:
SELECT id, nom, CHAR_LENGTH(nom) FROM mahsulotlar WHERE CHAR_LENGTH(nom) > 50;
Ustunni o'chirish
ALTER TABLE mijozlar DROP COLUMN faks;
Ma'lumot qaytarib bo'lmaydigan tarzda yo'qoladi.
Cheklov va indekslarni o'zgartirish
-- UNIQUE qo'shish
ALTER TABLE mijozlar ADD CONSTRAINT uq_telefon UNIQUE (telefon);
-- CHECK qo'shish
ALTER TABLE mahsulotlar ADD CONSTRAINT chk_narx CHECK (narx > 0);
-- Foreign key qo'shish
ALTER TABLE buyurtmalar
ADD CONSTRAINT fk_mijoz FOREIGN KEY (mijoz_id) REFERENCES mijozlar(id);
-- O'chirish
ALTER TABLE mijozlar DROP INDEX uq_telefon; -- UNIQUE — bu indeks
ALTER TABLE mahsulotlar DROP CHECK chk_narx;
ALTER TABLE buyurtmalar DROP FOREIGN KEY fk_mijoz;
-- DEFAULT ni o'zgartirish
ALTER TABLE buyurtmalar ALTER COLUMN holat SET DEFAULT 'yangi';
ALTER TABLE buyurtmalar ALTER COLUMN holat DROP DEFAULT;
Jadval nomini o'zgartirish
RENAME TABLE mijozlar TO xaridorlar;
-- yoki
ALTER TABLE mijozlar RENAME TO xaridorlar;
Foreign key lar avtomatik yangi nomga ishora qiladi. Lekin ilova kodidagi SQL so'rovlarni o'zingiz yangilashingiz kerak.
DROP — butunlay o'chirish
DROP TABLE buyurtma_qatorlari;
DROP TABLE IF EXISTS eski_jadval; -- yo'q bo'lsa xato bermaydi
DROP DATABASE test_baza;
DROP TABLE — jadval tuzilmasi va barcha ma'lumoti yo'qoladi. DROP DATABASE — barcha jadvallari bilan.
Foreign key bor bo'lsa — avval bola jadvallar:
DROP TABLE mijozlar;
-- ERROR 3730: Cannot drop table 'mijozlar' referenced by a foreign key constraint
TRUNCATE — ma'lumotni tozalash
TRUNCATE TABLE kirish_loglari;
DELETE FROM t |
TRUNCATE TABLE t |
DROP TABLE t |
|
|---|---|---|---|
| Ma'lumot | O'chadi | O'chadi | O'chadi |
| Tuzilma | Qoladi | Qoladi | O'chadi |
WHERE |
Mumkin | Yo'q — hammasi | — |
| Tezlik | Sekin (qatorma-qator) | Juda tez | Juda tez |
AUTO_INCREMENT |
Davom etadi | 1 ga qaytadi | — |
ROLLBACK |
Mumkin | Yo'q | Yo'q |
Production da ALTER — ehtiyotkorlik
Kichik jadvalda ALTER bir zumda bajariladi. 50 million qatorli jadvalda esa — daqiqalab yoki soatlab. Shu vaqt davomida jadval qulflangan bo'lishi mumkin — sayt "osilib" qoladi.
MySQL 8 ko'p amallarni jadvalni qulflamasdan bajaradi:
ALTER TABLE mijozlar ADD COLUMN izoh TEXT, ALGORITHM=INSTANT;
| Algoritm | Ma'nosi |
|---|---|
INSTANT |
Faqat metama'lumot o'zgaradi — bir zumda (ustun qo'shish, nom o'zgartirish) |
INPLACE |
Jadval joyida qayta quriladi, o'qish/yozish davom etadi |
COPY |
Butun jadval nusxalanadi — sekin, yozish bloklanadi |
ALGORITHM=INSTANT deb yozsangiz va amal buni qo'llab-quvvatlamasa — MySQL bajarmasdan xato beradi. Bu sizni kutilmagan uzoq qulfdan himoya qiladi.
Juda katta jadvallar uchun maxsus vositalar bor: pt-online-schema-change, gh-ost.
[!TIP] Production bazada har qanday
ALTERyokiDROPdan oldin backup oling (52-dars). Va avval nusxa bazada sinab ko'ring.
Migratsiyalar
Haqiqiy loyihalarda ALTER buyruqlari qo'lda emas, migratsiya fayllari orqali bajariladi:
migrations/
├── 2026_09_01_create_mijozlar.sql
├── 2026_10_15_add_tugilgan_kun_to_mijozlar.sql
└── 2026_11_02_rename_shahar_to_viloyat.sql
Har bir fayl — bitta o'zgarish, Git da saqlanadi. Har bir dasturchi va server bir xil tartibda qo'llaydi. Laravel, Prisma, Sequelize, TypeORM — hammasida o'z migratsiya tizimi bor (57-59 darslar).
Nima uchun shunday?
Nima uchun MySQL da DDL buyruqlarini (ALTER, DROP) ROLLBACK bilan qaytarib bo'lmaydi?
MySQL da DDL buyruqlari implicit commit qiladi: bajarilishidan oldin joriy tranzaksiyani avtomatik yakunlaydi va o'zi ham darhol saqlanadi. Bu MySQL ning ichki arxitekturasi bilan bog'liq — jadval tuzilmasi alohida saqlanadi. (PostgreSQL da esa DDL ni ham tranzaksiya ichida qaytarish mumkin.) Amaliy xulosa: MySQL da DROP — haqiqatan ham yakuniy. Faqat backup qutqaradi.
Xulosa
Eslab qoling:
ADD COLUMN— qo'shish;NOT NULLbo'lsaDEFAULTbilanMODIFY— ta'rifni to'liq almashtiradi;RENAME COLUMN— faqat nomDROP COLUMN,DROP TABLE,DROP DATABASE— qaytarib bo'lmaydiTRUNCATE— tez tozalash,AUTO_INCREMENTqaytadi,ROLLBACKyo'q- Bir nechta o'zgarishni bitta
ALTERda - Katta jadvallarda
ALGORITHM=INSTANT, avval backup - Haqiqiy loyihada — migratsiya fayllari
Keyingi dars
9-dars: INSERT — bir va bir nechta qator, INSERT IGNORE, ON DUPLICATE KEY