Veritabanı yönetim sistemlerinde verilerin doğruluğu, tutarlılığı ve güvenilirliği kritik öneme sahiptir. SQL Constraint’ler, bu veri bütünlüğünü sağlamak ve istenmeyen veya geçersiz verilerin veritabanına girişini engellemek için kullanılan güçlü araçlardır. İlişkisel veritabanlarının temel taşlarından olan bu kısıtlamalar, veritabanı şemasının tanımlı kurallara uygun kalmasını garanti ederek uzun vadede veri kalitesini maksimize eder ve uygulama hatalarını minimize eder.

Veri Bütünlüğü: İlişkisel Veritabanlarının Temeli

Veri bütünlüğü, veritabanındaki bilgilerin doğruluğunu, tutarlılığını ve güvenilirliğini ifade eder. Bu, verilerin istenmeyen değişikliklerden veya bozulmalardan korunması anlamına gelir. İlişkisel veritabanlarında genellikle dört ana veri bütünlüğü türü bulunur:

  • Varlık Bütünlüğü (Entity Integrity): Her satırın bir tablonun içinde benzersiz bir şekilde tanımlanabilmesini sağlar. Genellikle PRIMARY KEY ile garanti edilir.
  • Referans Bütünlüğü (Referential Integrity): Bir tablodaki yabancı anahtar değerlerinin, ilişkili tablodaki birincil anahtar değerleriyle eşleşmesini veya NULL olmasını sağlar. FOREIGN KEY ile garanti edilir.
  • Alan Bütünlüğü (Domain Integrity): Bir sütundaki tüm değerlerin belirli bir tür, biçim ve aralık dahilinde olmasını sağlar. NOT NULL, CHECK ve DEFAULT ile desteklenir.
  • Kullanıcı Tanımlı Bütünlük (User-Defined Integrity): İş gereksinimlerine özgü ek kuralları ifade eder ve genellikle CHECK constraint’ler veya tetikleyiciler (trigger) aracılığıyla uygulanır.

SQL Constraint’ler, bu bütünlük kurallarını doğrudan veritabanı şeması düzeyinde uygulayarak, verilerin uygulamalardan bağımsız olarak tutarlı kalmasını sağlar.

SQL Constraint’ler Nelerdir ve Nasıl Çalışır?

SQL Constraint’ler, bir veritabanı tablosundaki sütunlara veya tüm tabloya uygulanan kurallar bütünüdür. Bu kurallar, veri ekleme (INSERT), güncelleme (UPDATE) veya silme (DELETE) işlemleri sırasında devreye girer ve tanımlı koşulların ihlal edilip edilmediğini kontrol eder. Eğer bir işlem bir kısıtlamayı ihlal ederse, veritabanı bu işlemi reddeder ve bir hata mesajı döndürür. Bu mekanizma, hatalı verilerin sisteme girişini engeller ve veritabanının sağlıklı yapısını korur.

Temel SQL Constraint Türleri ve Kullanımları

1. NOT NULL Constraint

NOT NULL constraint, bir sütundaki değerlerin boş (NULL) olamayacağını garanti eder. Bu, o sütun için mutlaka bir değer girilmesi gerektiğini belirtir. Özellikle kritik bilgiler içeren sütunlar (örneğin, kullanıcı adları, sipariş numaraları) için hayati öneme sahiptir.

CREATE TABLE Musteriler (
    MusteriID INT NOT NULL,
    Ad VARCHAR(50) NOT NULL,
    Soyad VARCHAR(50),
    Email VARCHAR(100)
);

2. UNIQUE Constraint

UNIQUE constraint, bir sütundaki veya sütun kümesindeki tüm değerlerin benzersiz olmasını garanti eder. İki satırın aynı değere sahip olmasını engeller. NULL değerlere izin verir, ancak her NULL değeri benzersiz kabul eder. Birden fazla UNIQUE constraint bir tabloya uygulanabilir.

CREATE TABLE Urunler (
    UrunID INT NOT NULL UNIQUE,
    UrunKodu VARCHAR(20) UNIQUE,
    UrunAdi VARCHAR(100) NOT NULL
);

3. PRIMARY KEY Constraint

PRIMARY KEY (Birincil Anahtar) constraint, bir tablodaki her satırı benzersiz bir şekilde tanımlayan bir sütun veya sütun kümesidir. PRIMARY KEY, hem NOT NULL hem de UNIQUE özelliklerini içerir. Bir tabloda yalnızca bir PRIMARY KEY olabilir ve bu, varlık bütünlüğünü sağlar.

CREATE TABLE Calisanlar (
    CalisanID INT PRIMARY KEY,
    Ad VARCHAR(50),
    Soyad VARCHAR(50),
    TCKimlikNo VARCHAR(11) UNIQUE -- T.C. Kimlik No da benzersiz olmalı, ama birincil anahtar değil
);

Birden fazla sütunlu bir birincil anahtar için (composite primary key):

CREATE TABLE SiparisDetay (
    SiparisID INT,
    UrunID INT,
    Miktar INT,
    PRIMARY KEY (SiparisID, UrunID)
);

4. FOREIGN KEY Constraint

FOREIGN KEY (Yabancı Anahtar) constraint, iki tablo arasındaki bağlantıyı kurar ve referans bütünlüğünü sağlar. Bir tablodaki yabancı anahtar, başka bir tablodaki (veya aynı tablodaki) birincil anahtara referans verir. Bu, yalnızca ilişkili tabloda mevcut olan değerlerin girilebileceği anlamına gelir.

CREATE TABLE Departmanlar (
    DepartmanID INT PRIMARY KEY,
    DepartmanAdi VARCHAR(50) NOT NULL
);

CREATE TABLE Personel (
    PersonelID INT PRIMARY KEY,
    Ad VARCHAR(50),
    Soyad VARCHAR(50),
    DepartmanID INT,
    FOREIGN KEY (DepartmanID) REFERENCES Departmanlar(DepartmanID)
);

Yabancı anahtarlar, ilişkili ana tablo üzerindeki silme (ON DELETE) ve güncelleme (ON UPDATE) işlemlerinin davranışını da kontrol edebilir:

  • ON DELETE CASCADE: Ana tablodan bir satır silindiğinde, ilgili yabancı anahtar içeren satırları da siler.
  • ON DELETE SET NULL: Ana tablodan bir satır silindiğinde, ilgili yabancı anahtar sütununu NULL yapar.
  • ON DELETE RESTRICT / NO ACTION: İlgili yabancı anahtar içeren satırlar varsa ana tablodan silme işlemine izin vermez. (Varsayılan davranış genellikle RESTRICT’tir.)

5. CHECK Constraint

CHECK constraint, bir sütundaki tüm değerlerin belirli bir koşulu karşılamasını garanti eder. Bu koşul, bir mantıksal ifade olarak tanımlanır ve her veri ekleme veya güncelleme işleminde kontrol edilir. Alan bütünlüğünü ve kullanıcı tanımlı bütünlüğü sağlamak için çok esnek bir yol sunar.

CREATE TABLE Ogrenciler (
    OgrenciID INT PRIMARY KEY,
    Ad VARCHAR(50) NOT NULL,
    Yas INT CHECK (Yas >= 18),
    NotOrtalamasi DECIMAL(3, 2) CHECK (NotOrtalamasi BETWEEN 0.00 AND 4.00),
    Cinsiyet CHAR(1) CHECK (Cinsiyet IN ('E', 'K'))
);

6. DEFAULT Tanımı

DEFAULT tanımı, bir sütuna hiçbir değer belirtilmediğinde otomatik olarak atanacak varsayılan bir değer belirler. Teknik olarak bir kısıtlama olmasa da, alan bütünlüğünü destekler ve veri girişi sırasında eksik değerlerin tutarlı bir şekilde yönetilmesini sağlar.

CREATE TABLE Ayarlar (
    AyarID INT PRIMARY KEY,
    AyarAdi VARCHAR(50) NOT NULL,
    AyarDegeri VARCHAR(100) DEFAULT 'Varsayılan Değer',
    OlusturmaTarihi DATETIME DEFAULT GETDATE() -- SQL Server için
);

Diğer veritabanlarında NOW() veya CURRENT_TIMESTAMP gibi fonksiyonlar kullanılabilir.

Constraint’lerin Yönetimi

Constraint’ler, tablo oluşturulurken tanımlanabileceği gibi, daha sonra ALTER TABLE komutu kullanılarak da eklenebilir veya silinebilir.

Constraint Ekleme:

ALTER TABLE Musteriler
ADD CONSTRAINT UQ_Email UNIQUE (Email);

ALTER TABLE Siparisler
ADD CONSTRAINT FK_MusteriSiparis FOREIGN KEY (MusteriID) REFERENCES Musteriler(MusteriID);

ALTER TABLE Urunler
ADD CONSTRAINT CK_FiyatPozitif CHECK (Fiyat > 0);

Constraint Silme:

Constraint silmek için, genellikle kısıtlamanın adını bilmek gerekir. Kısıtlama adları, tablo oluşturulurken veya ALTER TABLE ADD CONSTRAINT ile açıkça belirtilebilir. Belirtilmezse, veritabanı sistemi otomatik olarak bir ad atar.

ALTER TABLE Musteriler
DROP CONSTRAINT UQ_Email;

ALTER TABLE Personel
DROP CONSTRAINT FK_DepartmanID; -- Veritabanına göre otomatik atanan ad farklı olabilir

SQL Constraint’ler, veritabanlarında veri bütünlüğünü sağlamanın ve korumanın vazgeçilmez bir parçasıdır. NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY ve CHECK gibi kısıtlamalar, verilerin doğruluğunu ve tutarlılığını garantilerken, DEFAULT tanımları da eksik değerlerin tutarlı yönetimine yardımcı olur. Bu kısıtlamaları doğru bir şekilde uygulamak, hatalı veri girişlerini önler, uygulama geliştirme süreçlerini basitleştirir ve uzun vadede veritabanı performansını ve güvenilirliğini artırır. Güçlü bir veritabanı şeması, temelinde sağlam constraint tanımları yatar.