← Kursa Dön
📄 Text · 30 min

ALTER TABLE — Tablo Yapısını Değiştirme

Giriş — Tablolar Değişir

Uygulama geliştikçe tablo yapıları değişir: yeni sütun eklenir, veri tipi değiştirilir, sütun silinir, tablo yeniden adlandırılır. ALTER TABLE bu yapısal değişiklikleri yapar.

⚠️ ALTER TABLE DDL komutudur — auto-commit yapar ve büyük tablolarda uzun sürebilir (tablo kilitlenir).


Sütun Ekleme (ADD COLUMN)

-- Tek sütun ekle
ALTER TABLE customers ADD COLUMN birth_date DATE;
ALTER TABLE customers ADD COLUMN loyalty_points INT DEFAULT 0;

-- Belirli pozisyona ekle
ALTER TABLE customers ADD COLUMN middle_name VARCHAR(50) AFTER first_name;
ALTER TABLE customers ADD COLUMN id_number VARCHAR(11) FIRST;  -- İlk sütun olarak

-- Birden fazla sütun
ALTER TABLE products 
    ADD COLUMN weight DECIMAL(8,3),
    ADD COLUMN dimensions VARCHAR(50),
    ADD COLUMN color VARCHAR(30);

Sütun Değiştirme (MODIFY / CHANGE)

-- Veri tipini değiştir (MODIFY — isim aynı kalır)
ALTER TABLE customers MODIFY COLUMN phone VARCHAR(30);  -- VARCHAR(20) → VARCHAR(30)
ALTER TABLE products MODIFY COLUMN price DECIMAL(12,2);  -- Daha geniş aralık

-- İsim + tip değiştir (CHANGE — isim de değişir)
ALTER TABLE customers CHANGE COLUMN city customer_city VARCHAR(100);

-- NOT NULL ekle/kaldır
ALTER TABLE products MODIFY COLUMN stock_quantity INT UNSIGNED NOT NULL DEFAULT 0;

-- DEFAULT değiştir
ALTER TABLE orders ALTER COLUMN status SET DEFAULT 'pending';
ALTER TABLE orders ALTER COLUMN status DROP DEFAULT;

Sütun Silme (DROP COLUMN)

ALTER TABLE customers DROP COLUMN middle_name;

-- Birden fazla sütun silme
ALTER TABLE products 
    DROP COLUMN dimensions,
    DROP COLUMN color;

⚠️ Dikkat: Sütun silmek geri alınamaz ve o sütundaki tüm veriler kaybolur. Production'da çok dikkatli ol.


Tablo Yeniden Adlandırma

-- Tablo adını değiştir
ALTER TABLE products RENAME TO items;
-- veya
RENAME TABLE products TO items;

-- Sütun adını değiştir (MySQL 8.0+)
ALTER TABLE customers RENAME COLUMN first_name TO given_name;

Index ve Constraint Ekleme/Kaldırma

-- Index ekle
ALTER TABLE products ADD INDEX idx_category (category_id);
ALTER TABLE customers ADD UNIQUE INDEX idx_email (email);

-- Foreign key ekle
ALTER TABLE orders ADD CONSTRAINT fk_orders_customer
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id);

-- Constraint kaldır
ALTER TABLE orders DROP FOREIGN KEY fk_orders_customer;
ALTER TABLE products DROP INDEX idx_category;

Büyük Tablolarda ALTER TABLE

-- Milyon satırlık tabloda ALTER TABLE uzun sürebilir
-- MySQL online DDL desteği (InnoDB):
ALTER TABLE large_table ADD COLUMN new_col INT, ALGORITHM=INPLACE, LOCK=NONE;
-- ALGORITHM=INPLACE: Tabloyu yeniden yazmaz (mümkünse)
-- LOCK=NONE: Tablo kilitlenmez (okuma/yazma devam eder)

-- Desteklenmeyen değişiklikler COPY algorithm kullanır (yavaş):
ALTER TABLE large_table MODIFY COLUMN name VARCHAR(500), ALGORITHM=COPY;

💡 İpucu: Production'da büyük tablo değişiklikleri için pt-online-schema-change (Percona) veya gh-ost (GitHub) araçlarını kullan — downtime olmadan ALTER TABLE yapar.


Özet

  • ADD COLUMN yeni sütun ekler, MODIFY tip değiştirir, CHANGE isim+tip değiştirir

  • DROP COLUMN sütunu siler — geri alınamaz

  • RENAME TABLE tablo adını değiştirir

  • ALTER TABLE DDL komutudur — auto-commit yapar

  • Büyük tablolarda ALGORITHM=INPLACE, LOCK=NONE ile online DDL tercih et