CREATE TABLE ve Kısıtlarla Güvenilir Tablo Tasarımı
CREATE TABLE ile tablo kurmayı, veri tiplerini ve PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK kısıtlarını örnek bir sipariş şemasıyla öğrenin.
CREATE TABLE ile tablo nasıl oluşturulur?
Tablo, SQL'de verinin satır ve sütunlar halinde saklandığı temel yapıdır. CREATE TABLE komutu tablonun adını, sütunlarını ve her sütunun veri tipini tanımlar. Genel kalıp şöyledir: CREATE TABLE customers yazılır, parantez içinde her sütun için ad ve tip, gerekirse kısıt belirtilir ve sütunlar virgülle ayrılır.
Veri tipi seçimi tasarımın ilk kararıdır. Tam sayılar için INTEGER, ondalıklı parasal değerler için kesinliği belli bir DECIMAL ya da NUMERIC, metin için VARCHAR ya da TEXT, tarih ve saat için DATE ve TIMESTAMP kullanılır. Tip adları ve ayrıntıları veritabanı sistemine göre değişir; hedef sisteminizin dokümantasyonuna bakın. Para tutarı için kayan noktalı tipten kaçının, çünkü yuvarlama farkları birikir.
Tablo oluşturmadan önce ad kuralınızı belirleyin: tutarlı bir dil, küçük harf ve alt çizgi gibi. Sonradan değiştirmek, bu tabloya bağlı tüm sorguların ve uygulamaların güncellenmesi anlamına gelir.
Kısıtlar neden vardır?
Kısıt (constraint), veritabanının verinin tutarlılığını kendisi denetlemesini sağlayan kurallardır. Uygulama kodunda doğrulama yapmak yeterli değildir; çünkü veriye başka uygulamalar, betikler ve elle yapılan düzeltmeler de erişir. Kural tabloda tanımlıysa hangi yoldan gelirse gelsin geçersiz veri girişi reddedilir.
Başlıca kısıt türleri şunlardır: • PRIMARY KEY: satırı benzersiz tanımlar. • FOREIGN KEY: başka bir tablodaki kaydı gösterir ve ilişkiyi korur. • UNIQUE: bir sütunun ya da sütun kombinasyonunun tekrar etmesini engeller. • NOT NULL: sütunun boş bırakılamayacağını belirtir. • CHECK: bir koşulu zorunlu kılar, örneğin tutarın negatif olamaması. • DEFAULT: değer verilmezse kullanılacak varsayılanı belirler (tam anlamıyla kısıt olmasa da tanımın parçasıdır).
Bu kuralların hepsi, daha sonra veri temizleme ihtiyacını azaltır. Hatalı veriyi girişte durdurmak, sonradan bulup düzeltmekten çok daha ucuzdur.
PRIMARY KEY ve UNIQUE: benzersizlik
PRIMARY KEY (birincil anahtar), tablodaki her satırı tek başına tanımlayan sütundur. Boş olamaz ve tekrar edemez; tabloda yalnızca bir birincil anahtar bulunur, ancak bu anahtar birden çok sütundan oluşabilir (bileşik anahtar). Çoğu tasarımda bu alan, sistemin otomatik artırdığı bir kimlik sütunudur (IDENTITY, AUTO_INCREMENT ya da SERIAL gibi; ad sisteme göre değişir). Birincil anahtar genellikle otomatik bir indeksle desteklenir, bu da aramaları hızlandırır.
UNIQUE ise iş açısından benzersiz olması gereken diğer alanlar içindir: müşterinin e-postası, ürünün stok kodu gibi. Birincil anahtardan farkı, tabloda birden çok UNIQUE kısıtı olabilmesi ve NULL değerlerin ele alınışının sisteme göre değişebilmesidir.
Sıkça sorulan bir tasarım kararı, doğal anahtar mı yapay anahtar mı kullanılacağıdır. Doğal anahtar iş verisinden gelir (kimlik numarası gibi), yapay anahtar sistemin ürettiği numaradır. İş verisi değişebileceği için pratikte yapay anahtar birincil anahtar, iş verisi ise UNIQUE kısıtı olarak tanımlanır.
FOREIGN KEY: tablolar arası ilişki
FOREIGN KEY (yabancı anahtar), bir tablodaki sütunun başka bir tablodaki birincil ya da benzersiz anahtara başvurmasıdır. Siparişler tablosundaki customer_id sütunu, müşteriler tablosundaki customer_id değerini gösterir. Kısıt tanımlıysa var olmayan müşteri için sipariş eklenemez ve siparişi olan müşteri silinemez.
Silme ve güncelleme davranışı seçilebilir. Üst kayıt silinirken bağlı kayıtlar için sistemin şu seçenekleri vardır: işlemi reddetmek, bağlı kayıtları da silmek (CASCADE), bağlı sütunu boşaltmak (SET NULL) ya da varsayılan değere çekmek. Bu seçim iş kuralıdır: bir müşteri silinirse geçmiş siparişleri kaybolmalı mı, yoksa korunmalı mı?
CASCADE kullanırken dikkatli olun; tek bir silme komutu zincirleme olarak birçok tabloyu etkileyebilir. Muhasebe ve sipariş gibi geçmişi korunması gereken verilerde silmeyi reddeden varsayılan davranış genellikle daha güvenlidir.
Kısıt ekledikten sonra yabancı anahtar sütununa indeks koymak, JOIN ve silme performansı için yararlıdır; bazı sistemler bunu kendiliğinden yapmaz.
Örnek şema: müşteri ve sipariş tabloları
Örneğin küçük bir satış şeması kurun. Müşteriler tablosunda customer_id birincil anahtar, e-posta sütunu NOT NULL ve UNIQUE, ad sütunu NOT NULL olsun. Siparişler tablosunda siparis_id birincil anahtar, customer_id NOT NULL ve müşteriler tablosuna FOREIGN KEY, siparis_tarihi NOT NULL ve varsayılan olarak o günün tarihi, tutar sütunu CHECK ile sıfırdan küçük olamaz kuralıyla tanımlansın.
Bu tanım sayesinde aynı e-postayla yeni bir müşteri daha eklenemez, müşterisiz sipariş girilemez, negatif tutar kaydedilemez. Uygulama kodu bu kuralların hiçbirini bilmese bile veri tutarlı kalır.
Kısıtları tablo oluştururken sütun tanımının yanına ya da tablo sonuna ayrı bir blok olarak yazabilirsiniz. Bileşik anahtar ve çok sütunlu UNIQUE gibi kurallar yalnızca tablo düzeyinde yazılır. Kısıtlara anlamlı adlar vermek (CONSTRAINT anahtar sözcüğüyle), hata mesajını okunur kılar ve sonradan silmeyi kolaylaştırır; otomatik üretilmiş adlar sistemden sisteme değişir.
Mevcut tabloya kısıt eklemek ve yaygın hatalar
Kısıtlar sonradan ALTER TABLE ile eklenebilir. Ancak tabloda kuralı ihlal eden veri varsa komut hata verir; örneğin tekrar eden e-postalar varken UNIQUE eklenemez, yetim sipariş satırları varken FOREIGN KEY eklenemez. Önce mevcut veriyi temizleyip sonra kısıt tanımlamak gerekir.
Sık yapılan hatalar: • Birincil anahtar tanımlamadan tablo oluşturmak; satırlar tekil olarak adreslenemez ve tekrarlar kolayca birikir. • Tüm sütunları NULL kabul edecek şekilde bırakmak; sonradan raporlarda boş değer sürprizleri çıkar. • Para ya da kimlik numarasını yanlış tipte saklamak; kimlik gibi toplanmayan numaraları sayı yerine metin tutmak başındaki sıfırları korur. • Yabancı anahtarı atlamak ve bütünlüğü uygulamaya bırakmak. • CASCADE silmenin sonuçlarını düşünmeden kullanmak. • Performans kaygısıyla kısıtları kaldırmak; çoğu zaman sorun kısıtta değil, eksik indekstedir.
İhtiyaç duyulduğunda kısıtı geçici olarak devre dışı bırakmak mümkündür, ama toplu yükleme sonrası tekrar etkinleştirip doğrulamak gerekir.
Öğrenme yolu ve Mindset bağlamı
Önce tek tabloyla başlayın: CREATE TABLE, veri tipleri, NOT NULL ve PRIMARY KEY. Sonra bir tablo daha ekleyip FOREIGN KEY ile ilişki kurun, ardından UNIQUE ve CHECK kurallarını deneyin. Her adımda hatalı veri eklemeyi deneyip kısıtın reddini görmek öğrenmeyi pekiştirir. Sonraki aşama normalizasyon ve ilişki tasarımıdır.
Mindset kataloğunda SQL ile Programlama Eğitimi, Veritabanları Oluşturma ve Tablolarla Çalışma modüllerini içerir. Veritabanı Tasarımı ve Normalizasyon eğitimi ise Kavramsal Modelleme ve Varlık İlişki Analizi, Mantıksal Model ve Anahtar Tasarımı, Normalizasyon Formları, Bütünlük Kısıtları ve Veri Kalitesi konularını kapsar. Bu içerikler, uygulama ve veri ekiplerinde şema tasarlayan geliştirici ve analistler için uygundur; kurumsal ekipler ortak bir adlandırma ve kısıt standardını bu müfredat üzerinden oturtabilir.
İlgili Mindset programı
SQL ile Programlama Eğitimi
Sık sorulan sorular
PRIMARY KEY ile UNIQUE arasındaki fark nedir?
Her ikisi de tekrarı engeller. Birincil anahtar satırın ana kimliğidir, boş olamaz ve tabloda yalnızca bir tane bulunur. UNIQUE ise ek benzersiz alanlar içindir, tabloda birden fazla olabilir ve NULL değerlerin davranışı veritabanı sistemine göre değişir. Yabancı anahtarlar genellikle birincil anahtara başvurur.
FOREIGN KEY zorunlu mudur?
SQL tablo oluşturmak için zorunlu değildir; ancak ilişkili tablolarda yabancı anahtar tanımlamamak, veri bütünlüğünü yalnızca uygulamaya bırakır. Yetim kayıtlar, silinmiş müşteriye bağlı siparişler gibi tutarsızlıklar kolayca ortaya çıkar. Çoğu ilişkisel tasarımda kısıtın tanımlanması önerilir.
Kısıtlar sorguları yavaşlatır mı?
Ekleme, güncelleme ve silme sırasında kısıtların denetlenmesi küçük bir maliyet getirir. Buna karşılık birincil ve benzersiz anahtarlar indeksle desteklendiği için aramalar hızlanır. Kısıtı kaldırmak yerine yabancı anahtar sütunlarında indeks bulundurmak ve yürütme planını incelemek daha sağlıklı bir yaklaşımdır.
Tablo oluşturduktan sonra sütun tipini değiştirebilir miyim?
ALTER TABLE ile çoğu sistemde değiştirilebilir, ancak mevcut verinin yeni tipe dönüştürülebilir olması gerekir ve büyük tablolarda işlem kilitlenmeye yol açabilir. Tip değiştirmek yerine baştan doğru seçmek ve değişiklikleri test ortamında denemek önerilir.
Otomatik artan kimlik sütunu nasıl tanımlanır?
Sisteme göre değişir: SQL Server'da IDENTITY, MySQL'de AUTO_INCREMENT, PostgreSQL'de SERIAL ya da kimlik sütunu tanımları kullanılır. Sütunu birincil anahtar olarak da işaretlemek yaygındır. Ayrıntılı sözdizimi için kullandığınız sistemin dokümantasyonuna bakın.
İlgili rehberler
İlgili eğitimler
Kategori: Veri Analitiği ve İş Zekası, Yazılım Geliştirme