5 min read

Bir veritabanında yapısal değişiklikler yapma

Bu yazıda bir veritabanında yapısal değişikliklere neden olan yeni tablo oluşturma, tablo yapısı değiştirme ve silme işlemlerini inceliyor ve örneklerle pekiştiriyoruz.
Bir veritabanında yapısal değişiklikler yapma

Bir veritabanını olduğu gibi kullanmanın yetersiz kaldığı durumlarda yeni tablolar eklemek veya varolan tabloların yapısını değiştirmek isteyebiliyoruz. Bazen de işe yaramayan tabloları silmek gerekebiliyor. Bu yazıda bu tür yapısal değişiklikler nasıl yapılır, bunu inceleyeceğiz.

Daha önceki yazılarda oluşturduğumuz PlacesDB veritabanı üzerinden devam ediyoruz. PlacesDB veritabanını oluşturduğumuz yazıya göz atmak isteyenler için:

SQL ile sıfırdan veritabanı tasarlama
Bu yazıda sıfırdan bir mekan veritabanı tasarlıyoruz. UML diyagramı sayesinde veritabanını önce soyut olarak resmedip, ardından sql ifadeleri ile gerçeğe dönüştürüyoruz.

1.Tablo oluşturma : CREATE TABLE

Veritabanına yeni tablo eklemek için CREATE TABLE ifadesini kullanırız. Fakat bazı ince detaylara dikkat etmezsek düşündüğümüzden çok farklı sonuçlarla karşılaşabiliriz.

Buna bir örnek vererek konuyu pekiştirelim.

Örnek: veritabanına yeni bir tablo ilave edelim.

PlacesDB kullanırken aklımıza gelen yeni bir özelliği uygulayabilmek için veritabanına yeni bir tablo eklememiz gerekebilir.

Diyelim ki mekanların yanında bir de bu mekanların yaptığı kampanyaları da saklamaya karar verdik. Yani mekan tablosundaki bir kafeye karşılık, kampanyalar tablosunda bir veya birkaç kayıt tutmak istiyoruz.

Bu durumda "campaign1 adında bir kampanya tablosu oluşturarak, mekan tablosuna bağlamamız gerekecek.

Bunun için daha önceden kaydettiğim UML diyagramını açarak, yeni bir tablo ekliyorum. Yeni tabloyu foreign key ile place tablosuna bağlayarak sonuçta oluşan yeni modeli kaydediyorum.

Yeni modeli sıfırdan oluşturmayacağımdan, sadece yeni tabloyu eklemek istiyorum (dikkat ederseniz varolan tablolarda herhangi bir değişikliğe sebep olmadık).

Burada campaign tablosuna sağ tıklayarak "Copy SQL to Clipboard" seçerek CREATE ifadesini kopyalıyorum.  Yeni bir sorgu tabı açarak buraya kopyaladığımda yeni tablomun SQL olarak tanımını görebiliyorum.

CREATE TABLE IF NOT EXISTS `placesdb`.`campaign` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(45) NULL,
  `details` VARCHAR(250) NULL,
  `placeId` INT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_place_id`
    FOREIGN KEY (`id`)
    REFERENCES `placesdb`.`place` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

İfadeyi Execute ile çalıştırarak yeni tablonun veritabanına eklendiğini görebiliriz.

Bu tabloya eklediğimiz kampanyalar belirli bir mekana bağlanabilecek. Bir mekanın birden fazla kampanyası olabilecek. Şimdilik bu dizayn isteklerimizi karşılıyor gibi görünüyor.

2.Bir tablonun yapısını değiştirme : ALTER TABLE

Tablo tanımı yapıldıktan sonra değiştirilmek isteniyorsa, ALTER TABLE ifadesi kullanılır. Peki PlacesDB'deki bir tablonun tanımında değişiklik yapmak istersek bunu nasıl yapacağız? Bunu bir örnekle görelim.

Örnek 2: Bir tablonun yapısını değiştirelim.

Dizaynımıza göre mekanların ait olduğu şehir alanı boş da bırakılabilir. Eğer bunu istemiyorsak bu alanları tablonun tanımında NOT NULL ile işaretlememiz gerekir.

Tablo tanımı değişeceğinden, önce tablonun CREATE ifadesini yeniden gözden geçirelim.

CREATE TABLE `place` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(120) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `categoryId` int(11) DEFAULT NULL,
  `cityId` int(11) DEFAULT NULL,
  `details` longtext COLLATE utf8mb4_unicode_ci,
  `dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
  `dateModified` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_category_id` FOREIGN KEY (`id`) REFERENCES `category` (`id`),
  CONSTRAINT `fk_city_id` FOREIGN KEY (`id`) REFERENCES `city` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Buradaki alanlardan biri olan cityId'yi değiştireceğiz. Böylece artık NULL yani boş değer girilmesine izin verilmeyecek.

ALTER TABLE `placesdb`.`place` 
CHANGE COLUMN `cityId` `cityId` INT(11) NOT NULL ;

Tablo detaylarında da bu alanın artık Nullable olmadığını görebiliyoruz.

Şimdi bir mekan ekleyelim fakat şehir bilgisi verilmemiş olsun.

Tahmin ettiğimiz gibi bu kaydın eklenmesine izin verilmedi. Şehir bilgisini ekleyerek yeniden denersek bu defa işlem başarılı olacaktır.

3.Bir tabloyu veritabanından silme: DROP TABLE

Bir tabloyu veritabanından silmek istiyorsak DROP TABLE ifadesi kullanırız. Bir örnekle bunu görelim.

Örnek 3: Bir tabloyu silelim.

PlacesDB'ye eklediğimiz bir tabloyu silmeye karar verebiliriz. Diyelim ki kullanmayı düşündüğümüz "kampanya" özelliğinden daha sonra vazgeçtik ve bu tablo artık gereksiz oldu. Bu durumda bu tabloyu silmemiz gerekecek.

DROP TABLE `placesdb`.`campaign`;

Bu şekilde tek satırla tabloyu veritabanından silmiş olduk.

NOT: Tablodaki bütün kayıtları silmek istiyor, fakat tablonun kendisi kalsın istiyorsak o zaman TRUNCATE TABLE ifadesi kullanırız.

4.Bir veritabanını tamamen silme: DROP DATABASE

Bir veritabanını tamamen silmek için DROP DATABASE ifadesi kullanılır.

Örnek 4: Bir veritabanını tamamen silelim.

PlacesDB'yi oluşturduktan sonra artık lazım olmadığından silmek isteyebiliriz. Veya silip yeniden oluşturarak  veritabanı üzerinde çalışmaya baştan başlamak istiyor olabiliriz. Bu durumda DROP ifadesi kullanılır.

DROP DATABASE `placesdb`;

Bu ifadeyi çalıştırırsanız placesdb adlı veritabanı bütün içeriği ile beraber silinecektir. Emin olmadan çalıştırmamakta fayda var.

Son söz.

Bu yazıda sql ile bir veritabanının yapısında ne gibi değişiklikler yapılabileceğini inceledik. Siz de elinizde varolan bir veritabanına yeni tablolar ekleyip silerek, ve varolan tabloların yapısını değiştirerek çeşitli durum senaryolarını çalışabilir ve veritabanı işlemlerine hakim olabilirsiniz. Yeni bir yazıda görüşmek üzere, hoşçakalın.