← Kursa Dön
📄 Text · 35 min

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 yap

  • SET 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 olabilir

NOT 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

  1. Her tabloda PRIMARY KEY olmalı — istisna yok

  2. İlişkiler FOREIGN KEY ile tanımlanmalı — uygulama katmanına güvenme

  3. İş kuralları CHECK ile korunmalı — negatif fiyat, %100+ indirim gibi

  4. Zorunlu alanlar NOT NULL olmalı — isim, e-posta, fiyat gibi

  5. 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