ALTER TABLE ile Tablo Yapısını Değiştirmek: Ekleme, Silme, Yeniden Adlandırma, Tip Değişikliği
Beceri rehberi

ALTER TABLE ile Tablo Yapısını Değiştirmek: Ekleme, Silme, Yeniden Adlandırma, Tip Değişikliği

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 6 dk okuma

ALTER TABLE, var olan bir tablonun yapısını veriyi koruyarak değiştirir. Üç yaygın sistemde sütun ekleme, silme, yeniden adlandırma ve tip değiştirme komutlarını, veri kaybı ve kilit risklerini gösterir.

Bir bakışta

  1. ALTER TABLE tabloyu baştan kurmadan yapıyı değiştirir. Sütun ekler, siler, yeniden adlandırır, tip ve kısıtları günceller; söz dizimi sisteme göre değişir.
  2. NOT NULL sütun için varsayılan değer ya da boş tablo gerekir. Mevcut satırların yeni sütunda alacağı bir değer olmalıdır.
  3. Sütun silmeden önce bağımlılıklara bakılır. İndeks, kısıt, görünüm ve yabancı anahtarlar silmeyi engelleyebilir ya da CASCADE ile birlikte gider.
  4. Tip değişikliği kayıp ve yeniden yazma riski taşır. Kısaltma veriyi keser; MySQL'de MODIFY yazılmayan özellikleri kaybettirir.
  5. Komut kilit alır, büyük tabloda bakım penceresi planlanır. Hazırlık, değişiklik ve doğrulama evreleriyle yürütülür.

ALTER TABLE ne yapar, hangi komut ne zaman

ALTER TABLE, var olan bir tablonun yapısını değiştirir: sütun ekler, siler, yeniden adlandırır, veri tipini ve kısıtlarını günceller. Tabloyu baştan kurmadan, içindeki veriyi koruyarak yapıyı yeni ihtiyaca uydurmanın standart yoludur. CREATE TABLE tablonun ilk halini tanımlar; ALTER TABLE sonraki değişikliklerin aracıdır.

Komutun temel kalıbı üç sistemde de benzerdir, ama ayrıntılar farklıdır. SQL Server, PostgreSQL ve MySQL belgeleri bunu açıkça gösterir: ekleme sözdizimi, yeniden adlandırma, tip değişikliğinin davranışı ve kilit yönetimi sistemden sisteme değişir. Bu yüzden her örnekte hangi sistemi kullandığınızı bilmeniz gerekir.

İşe doğru komutla başlamak için önce niyetinizi belirleyin: yeni bir bilgi mi saklayacaksınız, bir sütunu mu kaldıracaksınız, yalnız adı mı yanlış, yoksa tip ya da kısıt mı değişecek? Karar, sonuçların ve risklerin farklı olduğu dört yola ayrılır.

Şekil 1

Niyetiniz, hangi ALTER TABLE biçiminin kullanılacağını belirler

Komut seçimi

Tabloda ne değiştirmek istiyorsunuz?
  1. Yeni bir bilgi saklayacağımSütun ekleNOT NULL ise varsayılan değer ya da boş tablo gerekir.
  2. Artık gerekmeyen bir sütun varSütunu silÖnce ona bağlı indeks, kısıt ve görünümlere bakın.
  3. Yalnız sütunun adı yanlışYeniden adlandırSaklanan veri değişmez; bağımlı nesneleri güncelleyin.
  4. Veri tipi ya da kısıt değişecekSütun tanımını değiştirVeri dönüşümü ve kayıp riski vardır; yedek alın.
Kaynak: Microsoft, PostgreSQL ve MySQL ALTER TABLE belgeleriMindset Institute

Sütun eklemek

Yeni bir bilgiyi saklamak için sütun eklenir. Üç sistemdeki yazım şöyledir:

SQL Server: ALTER TABLE dbo.musteri ADD telefon VARCHAR(20) NULL;

PostgreSQL: ALTER TABLE musteri ADD COLUMN telefon varchar(20);

MySQL: ALTER TABLE musteri ADD COLUMN telefon VARCHAR(20) AFTER ad;

SQL Server sözdiziminde COLUMN sözcüğü eklemede kullanılmaz. MySQL'de FIRST ya da AFTER ile sütunun konumu belirlenebilir; varsayılan olarak en sona eklenir. SQL Server belgelerine göre sütunlar mevcut sütunların sonuna eklenir.

NOT NULL bir sütun eklemek özel dikkat ister. Tabloda satır varsa yeni sütunun mevcut satırlarda alacağı bir değer olmalıdır. SQL Server belgesi, NOT NULL sütunun yalnız varsayılan değer belirtildiğinde ya da tablo boşsa eklenebileceğini söyler. PostgreSQL belgesine göre değişmeyen bir varsayılan değerle sütun eklemek tabloyu yeniden yazmayı gerektirmez; ama anlık zaman damgası gibi değişen bir varsayılan tabloyu ve indekslerini baştan yazar. Büyük tablolarda bu fark dakikalar ile saatler arasındadır.

Sütun silmek ve bağımlılıklar

Silme komutu kısadır, sonuçları büyüktür:

SQL Server ve MySQL: ALTER TABLE musteri DROP COLUMN telefon;

PostgreSQL: ALTER TABLE musteri DROP COLUMN telefon RESTRICT;

SQL Server belgesi, bir sütunun indeksi, CHECK, FOREIGN KEY, UNIQUE ya da PRIMARY KEY kısıtı veya varsayılan değeri varsa silinemeyeceğini belirtir; önce bunları kaldırmanız gerekir. PostgreSQL ise sütunu içeren indeks ve tablo kısıtlarını otomatik siler, ama tablonun dışından, örneğin bir görünüm ya da başka bir tablonun yabancı anahtarı tarafından kullanılıyorsa CASCADE yazmanızı ister. RESTRICT, bağımlı nesne varsa silmeyi reddeder ve varsayılandır. CASCADE bağımlı nesneleri de siler; bu yüzden iyi düşünülmeden kullanılmamalıdır.

MySQL'de sütun bir indekste yer alıyorsa indeksten de çıkar; indeksi oluşturan tüm sütunlar silinirse indeks de kalkar.

Bir de disk alanı gerçeği vardır. SQL Server belgesine göre sütunu silmek disk alanını geri kazandırmaz; PostgreSQL belgesi de sütunun fiziksel olarak kaldırılmadığını, yalnızca SQL işlemlerinden gizlendiğini ve alanın zamanla geri kazanıldığını söyler. Silmeden önce sütundaki veriye ihtiyaç olmadığından emin olun; geri alma yolu yedektir.

Sütunu yeniden adlandırmak

PostgreSQL ve MySQL'de ad değiştirme açık bir komutla yapılır:

ALTER TABLE musteri RENAME COLUMN telefon TO cep_telefonu;

PostgreSQL belgesine göre yeniden adlandırma saklanan veriyi etkilemez. MySQL belgesi bu komutun yalnız adı değiştirdiğini, tanımı değiştirmediğini söyler; sütuna bağlı indeks ve yabancı anahtarlar otomatik güncellenir. Görünümler ve saklı programlar ise otomatik güncellenmez; tanımlarını elle değiştirmeniz gerekir. Üretilmiş sütun ifadeleri de benzer şekilde kendiliğinden güncellenmez.

Bu yüzden adı değiştirmeden önce sütunun nerelerde kullanıldığını arayın: görünümler, saklı yordamlar, raporlar, uygulama kodu. Adı kolay değiştirilen bir sütun, uygulamayı bir gecede bozabilir. SQL Server'da adlandırma farklı bir mekanizmayla yapılır; ayrıntı için Microsoft'un ALTER TABLE belgesindeki ilgili bölüme bakın.

Veri tipini değiştirmek

Tip değişikliği en riskli işlemdir, çünkü mevcut verinin yeni tipe dönüşmesi gerekir. Üç sistemde yazım şöyledir:

SQL Server: ALTER TABLE dbo.musteri ALTER COLUMN ad NVARCHAR(100) NOT NULL;

PostgreSQL: ALTER TABLE musteri ALTER COLUMN ad TYPE varchar(100);

MySQL: ALTER TABLE musteri MODIFY ad VARCHAR(100) NOT NULL;

SQL Server'da ALTER COLUMN sözdizimi, tipin yanında boş değer iznini (NULL ya da NOT NULL) de belirtmenize izin verir. MySQL belgesinde MODIFY ve CHANGE tanımı yeniden yazar: örneğin sütun UNSIGNED, DEFAULT ve COMMENT taşıyorsa, yalnız tipi yazarsanız bu özellikler kaybolur. Tam tanımı yeniden yazmak gerekir.

PostgreSQL'de otomatik dönüşüm yoksa USING ile dönüşüm kuralı verilir:

ALTER TABLE musteri ALTER COLUMN dogum_metni TYPE date USING CAST(dogum_metni AS date);

Her üç belge de kayıp uyarısı verir. SQL Server, duyarlılığı daraltan değişikliklerin verinin kesilmesine yol açabileceğini söyler. MySQL, string sütunu kısaltırsanız değerlerin kesilebileceğini ve bunun yerine hata almak için katı SQL modunu açmayı önerir. PostgreSQL ise tip değişikliğinin tabloyu çoğunlukla baştan yazdığını belirtir.

Boş değer izni olan sütunu NOT NULL yapmadan önce boşları doldurun:

UPDATE dbo.musteri SET telefon = N'bilinmiyor' WHERE telefon IS NULL; ALTER TABLE dbo.musteri ALTER COLUMN telefon NVARCHAR(20) NOT NULL;

SQL Server belgesinde de aynı sırayla bir örnek vardır: önce güncelleme, sonra kısıt.

Kilitler ve büyük tablolarda etki

ALTER TABLE, tabloya erişimi kısıtlayan kilitler alır. SQL Server belgesine göre şema değiştirme kilidi, değişiklik süresince tablonun meta verisine diğer tüm erişimi engeller. PostgreSQL'de aksi belirtilmedikçe ACCESS EXCLUSIVE kilidi alınır ve birden çok alt komut yazarsanız içlerinden en katı olanın kilidi geçerli olur; bu kilit diğer oturumların tabloya erişimini sınırlar. Tabloyu yeniden yazan işlemler ayrıca zaman ve geçici disk alanı ister.

MySQL'de ALGORITHM ve LOCK seçenekleriyle davranışı yönlendirebilirsiniz. INSTANT yalnız veri sözlüğünü değiştirir, INPLACE tablo verisini kopyalamadan çalışabilir, COPY ise satırları yeni bir tabloya kopyalar ve eşzamanlı yazmaya izin vermez. Desteklenmeyen bir algoritma isterseniz sessizce başka yöntemi seçmek yerine hata alırsınız; bu davranış yanlış beklentiyle üretimi kilitlemenizi önler.

Sonuç olarak yoğun saatlerde büyük bir tabloda tip değiştirmek yerine bakım penceresi planlayın.

Güvenli yürütme sırası

Yapısal değişikliği üç evrede yürütün. Hazırlıkta yedek alın, değişikliği bağımlı nesneler açısından inceleyin, komutu test ortamında gerçek boyuttaki bir kopyada deneyin ve süreyi ölçün. Değişiklik evresinde komutu bakım penceresinde çalıştırın, yarım kalırsa ne yapacağınızı önceden belirleyin. Doğrulamada tablonun yeni yapısını kontrol edin, satır sayısını ve örnek verileri karşılaştırın, uygulama ve raporların çalıştığını görün.

Değişiklik betiğini sürüm kontrolünde saklayın ve geri alma komutunu birlikte yazın. Sütun silme gibi geri dönüşsüz işlemlerin geri dönüşü yalnızca yedektir.

Şekil 2

Önce hazırlık ve deneme, sonra değişiklik, en sonda doğrulama

Yapısal değişiklik evreleri

  1. HazırlıkYedek ve bağımlılık kontrolüGörünüm, yordam ve raporlara bakılır; test kopyasında denenir.
  2. DeğişiklikBakım penceresinde çalıştırmaKomut, geri alma planıyla çalıştırılır.
  3. DoğrulamaYapı ve veri kontrolüSatırlar, örnekler, uygulama ve raporlar sınanır.
Kaynak: sayfa içeriğiMindset Institute

Bu beceriyi Mindset programlarında nerede çalışırsınız

Tablo yapısını yönetmek, SQL kullanan her analist ve geliştiricinin sıkça yaptığı bir iştir. SQL ile Programlama Eğitimi, veritabanları oluşturma ve tablolarla çalışma başlıklarını ayrı modüller olarak işler; tablo yapısını kurma ve değiştirme becerisini bu modüllerde pekiştirebilirsiniz.

İlgili Mindset programı

SQL ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

ALTER TABLE veriyi siler mi?

Sütun eklemek ya da yeniden adlandırmak mevcut veriyi silmez. Sütun silmek o sütunun verisini kaldırır. Tip değişikliği ise veriyi dönüştürür ve duyarlılığı daraltıyorsa değerlerin kesilmesine yol açabilir. Önemli bir tabloya dokunmadan önce yedek almak her durumda doğrudur.

Neden NOT NULL sütun eklerken hata alıyorum?

Tabloda satır varsa yeni sütunun mevcut satırlarda bir değeri olmalıdır. SQL Server belgesine göre NOT NULL sütun, yalnız varsayılan değer belirtildiğinde ya da tablo boş olduğunda eklenebilir. Çözüm, varsayılan değer vermek ya da önce boş değer izinli ekleyip doldurmak, sonra NOT NULL yapmaktır.

Sütunu silmek neden disk alanını hemen küçültmüyor?

SQL Server belgesi, sütun silmenin disk alanını geri kazandırmadığını söyler. PostgreSQL de sütunu fiziksel olarak kaldırmaz; yalnızca görünmez yapar ve alan zamanla geri kazanılır. Alanı hemen geri almak için tabloyu yeniden yazan bir işlem yapmak gerekir.

MySQL'de MODIFY ile CHANGE arasındaki fark nedir?

MODIFY sütunun adını değiştirmeden tanımını yeniden yazar. CHANGE hem adı hem tanımı değiştirir ve eski adı ile yeni adı birlikte yazmanızı ister. Her ikisinde de sütunun tam tanımını belirtmeniz gerekir; yazmadığınız özellikler kaybolur.

ALTER TABLE canlı sistemde çalıştırılabilir mi?

Teknik olarak evet, ama kilit alır. Küçük tablolarda fark edilmez; büyük tablolarda uygulamayı bekletebilir. Önce test ortamında süreyi ölçün, yoğun olmayan saati seçin ve sisteminizin sunduğu çevrimiçi ya da anlık seçenekleri değerlendirin.

SQL ALTER TABLE: Sütun Ekleme, Silme, Tip Değiştirme