ProgramlamaFullstack geliştirici

SQL'de kısıtlamaların (constraints) ne olduğu, hangi tür kısıtlamaların bulunduğu ve bunların uygulama mantığında hataları önlemeye nasıl yardımcı olduğu nedir? Kullanım örnekleri veriniz.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Kısıtlamalar (constraints), sütunlar veya tablolar üzerinde geçerlilik değerlerini otomatik olarak kontrol etmek için getirilen bütünlük kısıtlamalarıdır. Bunlar şunları sağlar:

  • Yanlış girişten verileri korumak;
  • Uygulama mantığının bir kısmını veritabanına almak (daha güvenilir ve hızlı);
  • Ekleme, güncelleme veya silme işlemleri sırasında koşulları otomatik olarak kontrol etmek.

Ana kısıtlama türleri:

  • PRIMARY KEY — benzersiz tanımlayıcı, tekrarları ve NULL'ı yasaklar.
  • UNIQUE — bir sütundaki değerlerin tekrarını yasaklar.
  • FOREIGN KEY — referans bütünlüğü, başka bir tabloyla bağlantı sağlar.
  • CHECK — rastgele bir ifadenin kontrolü.
  • NOT NULL — bir sütundaki NULL değerleri yasaklar.

Örnek:

CREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id), -- yabancı anahtar price DECIMAL(10,2) CHECK (price > 0), created_at TIMESTAMP NOT NULL );

Kandırmaca Soru

"Benzersiz anahtar (UNIQUE) otomatik olarak NULL-GÜVENLİ midir, sütundaki herhangi bir sayıda NULL değerini hariç tutar mı?"

Aslında, çoğu DBMS'de (örneğin, PostgreSQL, MySQL) UNIQUE kısıtlaması birkaç satıra NULL değeri girmeye izin verir; çünkü NULL "bilinmeyen" olarak değerlendirilir. Bu genellikle görünmeyen boş değerlerin tekrarına yol açar.

Örnek:
CREATE TABLE test ( id INT PRIMARY KEY, code VARCHAR(10) UNIQUE ); INSERT INTO test (id, code) VALUES (1, NULL), (2, NULL); -- başarılı olur

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri


Hikaye

Uygulama e-posta ile kayıt olmasına izin veriyordu, sütun UNIQUE idi ancak NOT NULL DEĞİLDİ — tabloda NULL-email ile bir düzine kullanıcı bulundu, bu da dış hizmetlerle entegrasyonda sorunlar yarattı.


Hikaye

Bilet siparişi sisteminde, payments tablosuna FOREIGN KEY eklemeyi unuttular — sonuç olarak, hiçbir siparişle bağlantılı olmayan ödemeler oluştu, bu da kullanıcılara iadeleri gerçekleştirmeyi zorlaştırdı.


Hikaye

İndirim için CHECK-kısıtlaması: discount > 0. 0 için sınır durumu unutuldu. Sonuç: sistem yalnızca 0'dan büyük indirimleri kabul etti, indirim yokluğu (0) iş mantığını bozdu.