Ana içeriğe geç
Kesit SQL
Orta · Veritabanı Tasarımı

ALTER TABLE, DROP ve TRUNCATE

Var olan tabloyu değiştirmek, kaldırmak ve şemayı sorgulamak.

Uygulamada aç, 6 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

ALTER TABLE

ALTER TABLE customers ADD COLUMN phone TEXT;
ALTER TABLE customers RENAME COLUMN segment TO customer_segment;
SELECT name FROM pragma_table_info('customers');

Sütun adlarını listelemek için standart yol INFORMATION_SCHEMA.COLUMNS görünümüdür (SQL Server, PostgreSQL, MySQL). Oracle kendi sözlük görünümlerini (USER_TAB_COLUMNS), SQLite pragma_table_info kullanır. Oracle tablo adlarını büyük harfle saklar.

Sütun tipini değiştirmek de yaygındır: SQL Server ALTER TABLE t ALTER COLUMN c NVARCHAR(200), PostgreSQL ALTER COLUMN c TYPE ..., MySQL/Oracle MODIFY. SQLite'ın ALTER desteği sınırlıdır.

DROP, TRUNCATE, DELETE

KomutNe yapar?
DELETE FROM tSatırları siler, yapı kalır, WHERE kullanılabilir, geri alınabilir.
TRUNCATE TABLE tTüm satırları hızla siler, yapı kalır (SQLite'ta yok).
DROP TABLE tTabloyu yapısıyla birlikte kaldırır.
DROP TABLE IF EXISTS raw_signups;
SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name;
Üretimde şema değişikliğiGerçek sistemlerde şema değişiklikleri migration araçlarıyla (Flyway, Liquibase, Alembic, dbt) sürümlenir ve geri alınabilir şekilde yapılır.

Derinleş: canlı tabloda güvenli şema değişikliği

Geliştirme ortamında ALTER TABLE bir satırdır; üretimde ise uygulama kodu, raporlar ve veri hatları o tabloya aynı anda bağlıdır. Bu yüzden şema değişiklikleri geriye uyumlu küçük adımlarla yapılır. Yaygın yönteme genişlet–daralt (expand–contract) denir:

  1. Genişlet: Yeni sütunu ekle (eski kod onu görmezden gelir, bir şey bozulmaz).
  2. Doldur: Mevcut satırlar için değeri hesapla (backfill); büyük tablolarda parça parça.
  3. Geçir: Uygulama ve raporları yeni sütuna geçir.
  4. Daralt: Artık kullanılmayan eski sütunu kaldır.
ALTER TABLE customers ADD COLUMN is_vip INTEGER DEFAULT 0 NOT NULL;
UPDATE customers SET is_vip = 1 WHERE segment = 'Premium';
SELECT is_vip, COUNT(*) AS musteri FROM customers GROUP BY is_vip ORDER BY is_vip;

Varsayılanlı ve NOT NULL bir sütun eklemek mevcut satırları varsayılanla doldurur (burada 150 müşterinin 117'si 0, Premium olan 33'ü güncellemeyle 1). Bazı eski sürümlerde bu işlem tüm tabloyu yeniden yazar ve uzun süre kilit tutar; büyük tablolarda önce NULL'a izin veren sütun ekleyip parça parça doldurmak daha güvenlidir.

DELETE, TRUNCATE, DROP: ayrıntılar

DELETETRUNCATEDROP
WHEREVarYokYok
YapıKalırKalırKalkar (indeks, izinler dahil)
HızSatır satır, günlüğe yazarÇok hızlı (sayfaları bırakır)Çok hızlı
IDENTITY / sıraDevam ederBaşa döner (SQL Server, MySQL)—
TriggerTetiklenirTetiklenmez—
Geri almaİşlem içinde mümkünSQL Server ve PostgreSQL'de işlem içinde mümkün; MySQL ve Oracle'da hayırOracle'da Flashback/geri dönüşüm kutusu dışında hayır
Bağımlılıkları unutmaSütun veya tablo kaldırmadan önce ona bakan görünümleri, yabancı anahtarları, saklı yordamları ve rapor sorgularını bul. SQL Server'da sys.sql_expression_dependencies, PostgreSQL'de DROP ... RESTRICT (varsayılan) bağımlı nesne varsa işlemi reddeder; CASCADE ise bağımlıları da sessizce siler.

Kontrol listesi: Değişiklik bir migration dosyasında mı? Geri alma (down) adımı yazıldı mı? Önce test ortamında, üretim boyutunda veriyle denendi mi? Kilit süresi ölçüldü mü?

Alıştırmalara geç (6)