ALTER TABLE — ustun qo'shish, o'zgartirish, o'chirish. DROP

~15 daq · MySQL · DDL — Tuzilma Boshqarish

Muammodan boshlaylik

Sayt 6 oy ishladi. Bazada 200 ming mijoz. Endi yangi talablar:

  • Mijozlarning tug'ilgan kuni kerak — tabriklash uchun
  • telefon ustuni VARCHAR(15) edi — xorijiy raqamlar sig'mayapti
  • shahar ustunini viloyat deb qayta nomlash kerak
  • Hech kim ishlatmaydigan faks ustunini 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] MODIFY ustun ta'rifini to'liq almashtiradi. Eski NOT NULL, DEFAULT, COMMENT ni yozmasangiz — ular yo'qoladi. Avval SHOW CREATE TABLE bilan 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 ALTER yoki DROP dan 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 NULL bo'lsa DEFAULT bilan
  • MODIFY — ta'rifni to'liq almashtiradi; RENAME COLUMN — faqat nom
  • DROP COLUMN, DROP TABLE, DROP DATABASE — qaytarib bo'lmaydi
  • TRUNCATE — tez tozalash, AUTO_INCREMENT qaytadi, ROLLBACK yo'q
  • Bir nechta o'zgarishni bitta ALTER da
  • 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