Kısıtlamalar (Constraints), veritabanı tarafından tablolardaki veriler üzerinde uygulanan kurallardir — veritabanı düzeyinde veri bütünlüğünü garantiler (sadece uygulama kodunda değil). Ana olanları: PRIMARY KEY, FOREIGN KEY, UNIQUE, , , ve .
Kısıtlamalar (Constraints), veritabanı tarafından tablolardaki veriler üzerinde uygulanan kurallardir — veritabanı düzeyinde veri bütünlüğünü garantiler (sadece uygulama kodunda değil). Ana olanları: PRIMARY KEY, FOREIGN KEY, UNIQUE, , , ve .
NOT NULLCHECKDEFAULTCREATE TABLE users (
id INT PRIMARY KEY, -- unique + not null identifier
email VARCHAR(255) UNIQUE NOT NULL, -- must be unique AND present
age INT CHECK (age >= 0 AND age <= 120), -- must satisfy a condition
country VARCHAR(2) DEFAULT 'US', -- default value if not provided
role VARCHAR(20) NOT NULL DEFAULT 'user',
manager_id INT REFERENCES users(id) -- FOREIGN KEY (referential integrity)
);
PRIMARY KEY → uniquely identifies a row (unique + not null, indexed)
FOREIGN KEY → references another table's key (referential integrity)
UNIQUE → no duplicate values allowed in this column
NOT NULL → the column must have a value (can't be NULL)
CHECK → the value must satisfy a condition (age >= 0, status IN (...))
DEFAULT → a value used when none is provided on insert
-- ❌ relying only on application code to enforce uniqueness:
-- a race condition or a bug or a different app could insert a duplicate
-- ✅ a UNIQUE constraint guarantees it at the DB level — ALWAYS enforced,
-- regardless of which code or how many apps access the database
email VARCHAR(255) UNIQUE
Veritabanı kısıtlamaları veri bütünlüğü için son savunma hattıdır — hangi kod veri ekler olursa olsun (birden fazla uygulama, scriptler, manuel değişiklikler veya hatalı kod) uygulanırlar ve uygulama düzeyinde kontroller tarafından kaçırılan yarış koşullarını (race conditions) ele alırlar.
CHECK (price > 0) -- prices must be positive
CHECK (status IN ('active', 'inactive')) -- only valid statuses
CHECK (end_date > start_date) -- logical consistency
CHECK işletme/domain kurallarını doğrudan şemada uygular.
Kısıtlamalar veri bütünlüğünü korumak için vazgeçilmezdir — veritabanınızdaki verilerin kuralları (benzersizlik, varlık, geçerli değerler, geçerli referanslar) karşıladığını veritabanı düzeyinde garantilerler, bu da güvenilir uygulamalar için temeldir, bu nedenle anlamak önemlidir.
Kısıtlama türlerini (PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK, DEFAULT) ve her birinin ne uyguladığını bilmek uygun şema tasarımı için gereklidir.
En önemli kavramsal nokta neden sadece uygulama kodunda değil veritabanı düzeyinde uygulanır: veritabanı kısıtlamaları veri bütünlüğü için son savunma hattıdır — hangi kod veya kaç uygulama veriye erişirse erişsin her zaman uygulanırlar, uygulama kontrolleri tarafından kaçırılabilecek hataları yakalarlar ve kritik olarak yarış koşullarını (race conditions) uygulama düzeyinde doğrulama yapamaz (örneğin iki eş zamanlı ekleme işleminin her ikisi de uygulama düzeyinde benzersizlik kontrolünü geçebilir ancak UNIQUE kısıtlaması doğru şekilde tekrarı reddeder).
Sadece uygulama koduna güvenmek risklidir; kısıtlamalar bir garanti sağlarlar.
Domain/işletme kurallarını (geçerli aralıklar, izin verilen değerler, mantıksal tutarlılık) doğrudan şemada uygulamak için CHECK kısıtlamalarını anlamak da değerlidir.
Veri bütünlüğü güvenilir uygulamalar için kritik olduğu ve kısıtlamalar uygulama kodunun tek başına yapamayacağı hataları, yarış koşullarını ve tutarsız verileri koruyan veritabanı düzeyinde garantiler sağladığı için, kısıtlamaları anlamak — türleri, bütünlük garantileri ve veritabanı düzeyinde uygulamanın önemini — sağlam veritabanlar tasarlamak için önemli, temel bilgidir ve verileri tutarlı ve geçerli kalan uygulamalar oluşturmanın önemli bir yönüdür.