NULL: Dikkat, ısırır!


Bir veritabanı tasarlıyorsanız, değerini bilemediğiniz hücrelerin nasıl davranacağına da kafa yormanız gerekir.

Normalde yazılımda, bir mantık ifadesinin karşılığı True ya da False’tur. Oysa veritabanında durum böyle olmaz. True, False yanısıra bir de Unknown durumu vardır. Doğru, yanlış, bilinmeyen…

Bir sınıftaki öğrencilerin boy bilgilerini tutan basit bir tablo düşünün. Öğrencilerin boylarını ölçüp tabloya giriyorsunuz ama ölçümü yaptığınız gün iki öğrenci yoktu. Bu durumda boylarına 0 girerseniz, olmaz. Bir değer giremeyeceğiniz için bu kolonda NULL’e izin vermeniz gerekecek. Yani bilinmiyor demiş olacaksınız.

Ne yapmış oluyorsunuz?

Bu iki kaçak öğrenciden birinin boyunu sınıftan bir başkasıyla karşılaştırırsanız, sonuç NULL döner. (Veritabanı ANSI opsiyonlarında değişiklik yapılmışsa geri dönüşünde farklılıklar olabilir, hata vermek ya da NULL dönmek gibi.)

Peki kaçak iki öğrencinin boyunu birbirleriyle karşılaştırırsanız? Yine NULL döner. Bu da beklenen bir şey. Ama ya boyu 170’den fazla olanları, bir de 170 ya da altı olanları iki ayrı sorguda sorgularsanız ne olacak? İki kaçak öğrencimizin sonucu her iki sorguda da yer almaz. Sadece boyu bilinenleri esas alır iki sorgunuz. Çünkü NULL hiçbir şeyden büyük de değildir, küçük de değildir, hiçbir şeye eşit de değildir.

Peki, kolonda bir CHECK kısıtınız varsa ne olacak? Bu durumda da (eğer kolonda NULL’e izin verdiyseniz) NULL’le karşılaştırma doğru dönecek.

Kaçak iki öğrencinin boylarının birbirine eşitliğini bir WHERE koşulunda test edersek, bilinmez değil FALSE gibi işlem görür. Oysa boy kolonunda bir unique index oluşturursanız, bu sefer de NULL bir değermiş ve iki satırda NULL olması birbirlerine eşitmiş gibi yorumlanır ve birden fazla NULL değere izin verilmez.

Kafanız karıştı değil mi? Amaç buydu zaten. NULL karışık bir konudur. Kurallarını öğrenirsiniz, biraz alışınca bunlar doğal da gelir, ama gerçek hayatta durum asıl karışıklığıyla ortaya çıkar. Milyonlarca satırınız varsa, bunlarla ilgili binlerce satır TSQL kodunuz çeşitli yerlerde çalışıyorsa, NULL’leri nerede nasıl ele aldığınızı hatırlamak ve takip etmek son derece zorlaşabilir.

NULL’lere dikkat edin! Dikkat etmezseniz, ısırırlar!

Bu yazı SQL Server içinde yayınlandı. Kalıcı bağlantıyı yer imlerinize ekleyin.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s