SQL ile Sıfırdan Veritabanı Oluşturma: CREATE DATABASE ve İlk Adımlar
CREATE DATABASE tek satırlık bir komuttur, ama sonradan değiştirmesi zor kararlar içerir: karakter seti, sıralama kuralı ve sahiplik. SQL Server, MySQL ve PostgreSQL'de veritabanını doğru ayarlarla kurmayı ve ilk tablolarla doldurmayı öğrenirsiniz.
Bir bakışta
- CREATE DATABASE komutu her sistemde vardır ama seçenekleri farklıdır. Ad dışında karakter seti ve sıralama kuralı gibi ayarlar sonradan değiştirilmesi zahmetli kararlardır.
- Karakter seti ve sıralama kuralını başta bilinçli seçin. Türkçe verilerde büyük/küçük harf ve İ ile ı davranışı bu kurala bağlıdır.
- MySQL'de veritabanı ve şema eş anlamlıdır. SQL Server ve PostgreSQL'de ise şema, veritabanının içindeki bir ad alanıdır.
- Veritabanını yaratan hesap yetkili olmalı, uygulama ise ayrı bir hesapla bağlanmalıdır. Sahiplik ve yetki, yaratıldığı anda planlanırsa sonradan düzeltme gerekmez.
- Veritabanı yapısını betikle kurun. Aynı betik geliştirme, test ve canlı ortamda aynı yapıyı ve ayarları üretir.
Veritabanı mı, şema mı? Kavramları ayırın
Veritabanı yaratmadan önce kapsayıcı kavramları netleştirin. Veritabanı, tablolar, görünümler ve diğer nesneleri barındıran en geniş birimdir; yedekleme, yetki ve ayarlar çoğunlukla bu düzeyde yapılır. Şema ise bir veritabanının içinde nesneleri gruplayan ad alanıdır. SQL Server ve PostgreSQL'de bir veritabanında birden çok şema olabilir; örneğin satış ve muhasebe tabloları ayrı şemalarda tutulur. MySQL'de ise belgeye göre CREATE SCHEMA ile CREATE DATABASE eş anlamlıdır; orada ayrı bir şema katmanı yoktur.
Bu fark taşınabilirlik açısından önemlidir. Bir MySQL projesinde veritabanı adlarıyla yapılan ayrımı PostgreSQL'e taşırken bunun şemalara dönüşmesi gerekebilir. Bir uygulama için tek veritabanı mı yoksa çok veritabanı mı kurulacağı da bir karardır: ortamlar (geliştirme, test, canlı) ayrı veritabanlarında tutulur, ama aynı uygulamanın modülleri genellikle tek veritabanında şemalarla ayrılır.
Veritabanına ad verirken küçük harf, alt çizgi ve Türkçe karakter içermeyen bir ad seçin. Türkçe harfli nesne adları çoğu sistemde çalışır ama araçlarda, betiklerde ve komut satırlarında tırnaklama ve kodlama sorunu çıkarır.
Üç sistemde CREATE DATABASE
En yalın biçim her sistemde aynıdır:
CREATE DATABASE satis;
Bu komut varsayılan ayarlarla bir veritabanı kurar. SQL Server'da belgeye göre yeni veritabanı model veritabanının kopyasıyla başlatılır; model veritabanına eklenen nesneler yeni yaratılan her veritabanında bulunur. Sıralama kuralı belirtilmezse sunucunun varsayılan kuralı atanır.
SQL Server'da ayarı açıkça vermek için:
CREATE DATABASE satis COLLATE Turkish_CI_AS;
MySQL'de karakter seti ve sıralama seçenekleri veritabanı düzeyinde verilir, IF NOT EXISTS ise komutun veritabanı varsa hata vermemesini sağlar:
CREATE DATABASE IF NOT EXISTS satis DEFAULT CHARACTER SET utf8mb4;
PostgreSQL'de yeni veritabanı varsayılan olarak standart şablon veritabanının kopyasıdır. Sahibi, kodlamayı ve şablonu açıkça belirtebilirsiniz:
CREATE DATABASE satis OWNER uygulama_sahibi ENCODING 'UTF8' TEMPLATE template0;
PostgreSQL belgesine göre kodlama ve yerel ayar, şablonun ayarlarıyla uyumlu olmak zorundadır; farklı bir kodlama ya da yerel ayar istiyorsanız şablon olarak template0 kullanılır. Ayrıca bu komut bir transaction bloğu içinde çalıştırılamaz.
Karakter seti ve sıralama kuralı: sonradan değiştirmesi zor kararlar
Karakter seti, veritabanında hangi harflerin saklanabileceğini belirler. Türkçe karakterler (ç, ğ, ı, İ, ö, ş, ü) ve başka dillerdeki harfler için tam Unicode desteği olan bir karakter seti seçin. Dar bir karakter seti ile kurulmuş veritabanında Türkçe harfler soru işaretine dönüşebilir ve düzeltmek, veriyi yeniden yüklemeyi gerektirebilir.
Sıralama kuralı (collation) metinlerin nasıl karşılaştırılacağını ve sıralanacağını belirler. Etkisi günlük işlerde hissedilir: aramada "ali" ile "Ali" aynı kabul edilsin mi, "ı" ile "i" ayrı harf mi sayılsın, sıralamada Türkçe alfabeye göre mi gidilsin? Büyük/küçük harf duyarsız bir kural kullanıcı araması için kolaylık sağlar, duyarlı bir kural ise teknik kodlar ve kimlikler için daha güvenlidir. Türkçe verilerde noktalı ve noktasız i harflerinin davranışı kurala göre değiştiği için Türkçe kurallarını seçip önce küçük bir örnek veriyle denemek gerekir.
Sistemlere göre yerleşik varsayılanlar değişir: SQL Server belgesine göre sıralama kuralı belirtilmezse sunucu örneğinin varsayılanı atanır; PostgreSQL'de yerel ayar şablondan gelir; MySQL belgesi ise varsayılan seçimini karakter setleri bölümüne bırakır. Önemli olan varsayılana güvenmek yerine ayarı kendiniz yazıp kod olarak saklamaktır.
Sahiplik, yetki ve ilk tabloların kurulumu
Veritabanı yaratmak yetki ister. PostgreSQL belgesine göre bunun için süper kullanıcı olmak ya da CREATEDB yetkisine sahip olmak gerekir. SQL Server'da CREATE DATABASE, CREATE ANY DATABASE ya da ALTER ANY DATABASE yetkisi, MySQL'de ilgili veritabanı için CREATE yetkisi aranır. Bu yetkiyi uygulamanın günlük bağlantı hesabına vermeyin. Veritabanını yönetici hesabı kursun, uygulama ise yalnızca ihtiyaç duyduğu yetkiyle bağlansın. PostgreSQL'de OWNER ile sahibi baştan atayabilirsiniz.
Veritabanı boşken işe başlamak için tabloları ve kısıtları betikle kurun. Betik dosyası sürüm denetimine girer, böylece geliştirme, test ve canlı ortamlarda aynı yapı çıkar:
CREATE TABLE musteri ( musteri_id INT PRIMARY KEY, ad VARCHAR(100) NOT NULL, sehir VARCHAR(100) );
CREATE TABLE siparis ( siparis_id INT PRIMARY KEY, musteri_id INT NOT NULL REFERENCES musteri (musteri_id), toplam DECIMAL(10, 2) );
Betiği yeniden çalıştırılabilir yapmak için IF NOT EXISTS gibi koruyucuları kullanın ya da betiği 'önce var mı kontrol et' mantığıyla yazın. Yapıyı sonradan değiştirmek içinse göç (migration) araçları kullanılır.
Veritabanı kurulumu, geri dönüşü zor kararlardan kolay olanlara doğru ilerler
Kurulum yol haritası
- KararSistem, sürüm ve adHangi veritabanı sistemi, hangi ortam ve hangi ad kullanılacak?
- Temel ayarKarakter seti ve sıralamaTam Unicode ve Türkçe'ye uygun kural, kurulumda seçilir.
- SahiplikSahip ve yetkiYönetici hesabı kurar, uygulama ayrı ve kısıtlı hesapla bağlanır.
- YapıŞemalar ve tablolarTablolar ve kısıtlar sürüm denetimli betikle kurulur.
- DoğrulamaDeneme ve yedekAyarlar sorgulanır, deneme verisi eklenir, yedek planı kurulur.
Kurulum sonrası kontrol ve sık hatalar
Veritabanı kurulduktan sonra kendi ayarlarınızı sorgulayarak doğrulayın: karakter seti ve sıralama kuralı beklediğiniz gibi mi, sahip kim, uygulama hesabı bağlanıp yalnızca izinli işlemleri yapabiliyor mu? Bir de içine Türkçe karakter içeren birkaç satır ekleyip geri okumak basit ama etkili bir testtir.
Sık yapılan hatalar şunlardır.
- Karakter seti ve sıralamayı varsayılana bırakmak: sonradan farklı bir kural gerektiğinde veriyi taşımak zorunda kalırsınız.
- Uygulamayı yönetici hesabıyla bağlamak.
- Tüm ortamlar için tek veritabanı kullanmak.
- Yapıyı elle, arayüzden kurup betiğini saklamamak: ortamlar farklılaşır.
- Yedekleme planını kurmayı ertelemek.
- Veritabanı adına Türkçe karakter ya da boşluk koymak.
CREATE DATABASE komutunu canlıda çalıştırmadan önce bir deneme ortamında ayarlarla birlikte prova edin. Komut kısa olsa da yanlış ayarla kurulmuş bir veritabanını düzeltmek, baştan kurmaktan pahalıdır.
Bu beceriyi Mindset programlarında nerede çalışırsınız?
Mindset'in SQL ile Programlama Eğitimi, Veritabanları Oluşturma modülünde veritabanı ve tablo kurulumunu uygular; Veritabanı Yönetim Sistemleri ve Uygulamaları ise Veri Modelleme ve Tasarım ile Veritabanı Yönetimi ve Optimizasyon başlıklarıyla tasarım ve işletme boyutunu ekler. Yeni bir uygulama için veritabanı kuran geliştiriciler ve ilk kez veritabanı yöneticisi rolüne geçenler için kritik kazanım, geri dönüşü zor ayarları baştan doğru yapmaktır.
Bir deneme sunucusunda aynı veritabanını farklı karakter seti ve sıralama ayarlarıyla kurup Türkçe örnek verileri sıralamak ve aramak, farkı görmenin en hızlı yoludur.
İlgili Mindset programı
SQL ile Programlama Eğitimi
Sık sorulan sorular
CREATE DATABASE komutunu çalıştırmak için hangi yetki gerekir?
PostgreSQL'de süper kullanıcı olmak ya da CREATEDB yetkisine sahip olmak gerekir. SQL Server'da CREATE DATABASE, CREATE ANY DATABASE ya da ALTER ANY DATABASE yetkisi aranır. MySQL'de ilgili veritabanı için CREATE yetkisi gerekir. Bu yetkiyi uygulama hesabına vermeyin.
MySQL'de veritabanı ile şema arasında fark var mı?
MySQL belgesine göre CREATE SCHEMA, CREATE DATABASE ile eş anlamlıdır; ikisi aynı nesneyi yaratır. SQL Server ve PostgreSQL'de ise şema, veritabanının içinde bir ad alanıdır ve bir veritabanında birden çok şema bulunabilir.
Karakter setini sonradan değiştirebilir miyim?
Çoğu sistemde mümkün olsa da veri yeniden yüklemek, dönüştürmek ya da tabloları yeniden yaratmak gerekir; büyük veritabanlarında zahmetlidir. Bu yüzden kurulum sırasında tam Unicode destekli bir karakter seti seçmek ve ayarı betikte saklamak en güvenli yoldur.
Veritabanı var mı diye kontrol ederek nasıl yaratırım?
MySQL'de CREATE DATABASE IF NOT EXISTS söz dizimi bunu tek komutla sağlar. PostgreSQL ve SQL Server'da bu söz dizimi doğrudan yoktur; sistem kataloğunda veritabanı adını sorgulayıp yoksa yaratan bir betik yazılır. Önce deneme ortamında prova edin.
Bulut veritabanı için de aynı komut mu kullanılır?
Bulut hizmetleri çoğunlukla kendi arayüzü ya da şablonu üzerinden veritabanı yaratır ve ayrıntılar hizmete göre değişir. SQL komutları çalışsa bile hizmet kendi sınırlarını ve ayarlarını koyar; bu nedenle ilgili bulut hizmetinin belgesine bakın.