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 COLUMNyeni sütun ekler,MODIFYtip değiştirir,CHANGEisim+tip değiştirirDROP COLUMNsütunu siler — geri alınamazRENAME TABLEtablo adını değiştirirALTER TABLE DDL komutudur — auto-commit yapar
Büyük tablolarda
ALGORITHM=INPLACE, LOCK=NONEile online DDL tercih et
AI Asistan
Sorularını yanıtlamaya hazır