Constraints: PRIMARY KEY, FOREIGN KEY, UNIQUE
Giriş — Verinin Koruyucu Kalkanı
Constraint'ler veritabanı seviyesinde veri bütünlüğünü koruyan kurallardır. Uygulama katmanındaki doğrulamalar bypass edilebilir ama veritabanı constraint'leri son savunma hattıdır — hiçbir şekilde atlanamaz.
PRIMARY KEY — Satırın Kimliği
-- Tablo oluştururken
CREATE TABLE users (
user_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL
);
-- Composite primary key
CREATE TABLE enrollments (
student_id INT,
course_id INT,
enrollment_date DATE,
PRIMARY KEY (student_id, course_id)
);
-- Sonradan ekleme
ALTER TABLE legacy_table ADD PRIMARY KEY (id);PK kuralları: Benzersiz + NOT NULL + tabloda tek + otomatik index.
FOREIGN KEY — İlişki ve Referans Bütünlüğü
CREATE TABLE orders (
order_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
customer_id INT UNSIGNED NOT NULL,
CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id)
REFERENCES customers(customer_id)
ON DELETE RESTRICT
ON UPDATE CASCADE
);ON DELETE/UPDATE seçenekleri:
RESTRICT— Silmeye/güncellemeye izin verme (varsayılan, en güvenli)CASCADE— Otomatik sil/güncelle (dikkatli kullan)SET NULL— FK sütununu NULL yapSET DEFAULT— Varsayılan değere ayarla
UNIQUE — Benzersizlik
-- Tek sütun
ALTER TABLE customers ADD CONSTRAINT uq_email UNIQUE (email);
-- Composite unique (kombinasyon benzersiz)
ALTER TABLE order_items
ADD CONSTRAINT uq_order_product UNIQUE (order_id, product_id);
-- UNIQUE vs PRIMARY KEY: UNIQUE NULL kabul eder (bir kez), tabloda birden fazla olabilirNOT NULL — Zorunlu Alan
ALTER TABLE products MODIFY COLUMN product_name VARCHAR(200) NOT NULL;
ALTER TABLE orders MODIFY COLUMN customer_id INT UNSIGNED NOT NULL;
-- NOT NULL kaldırma
ALTER TABLE products MODIFY COLUMN description TEXT NULL;CHECK — Değer Doğrulama (MySQL 8.0.16+)
ALTER TABLE products ADD CONSTRAINT chk_price CHECK (price > 0);
ALTER TABLE products ADD CONSTRAINT chk_discount CHECK (discount_percent BETWEEN 0 AND 100);
ALTER TABLE employees ADD CONSTRAINT chk_salary CHECK (salary >= 0);
-- Karmaşık check
ALTER TABLE order_items ADD CONSTRAINT chk_quantity CHECK (quantity > 0 AND quantity <= 9999);DEFAULT — Varsayılan Değer
ALTER TABLE products ALTER COLUMN is_active SET DEFAULT TRUE;
ALTER TABLE orders ALTER COLUMN status SET DEFAULT 'pending';
ALTER TABLE customers ALTER COLUMN registration_date SET DEFAULT (CURRENT_DATE);Constraint Yönetimi
-- Constraint'leri listele
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = 'e_commerce';
-- Constraint silme
ALTER TABLE orders DROP FOREIGN KEY fk_orders_customer;
ALTER TABLE products DROP CHECK chk_price;
ALTER TABLE customers DROP INDEX uq_email;Best Practices
Her tabloda PRIMARY KEY olmalı — istisna yok
İlişkiler FOREIGN KEY ile tanımlanmalı — uygulama katmanına güvenme
İş kuralları CHECK ile korunmalı — negatif fiyat, %100+ indirim gibi
Zorunlu alanlar NOT NULL olmalı — isim, e-posta, fiyat gibi
Constraint'lere anlamlı isim ver — hata ayıklama kolaylaşır
Özet
PRIMARY KEY: benzersiz tanımlayıcı, tabloda tek, NOT NULL
FOREIGN KEY: tablolar arası referans bütünlüğü, ON DELETE davranışını belirle
UNIQUE: benzersizlik, tabloda birden fazla, NULL kabul eder
NOT NULL: boş değer engeller
CHECK: değer aralığı/kuralı doğrular (MySQL 8.0.16+)
DEFAULT: belirtilmezse atanacak varsayılan değer
Constraint'ler veritabanı seviyesinde son savunma hattıdır
AI Asistan
Sorularını yanıtlamaya hazır