giriiş
Bir veritabanı tasarlarken, belirli sütunlarda izin verilen verilere kısıtlamalar koymak isteyebilirsiniz. Örneğin, gökdelenler hakkında bilgi içeren bir tablo oluşturuyorsanız, her binanın yüksekliğini tutan sütunun negatif değerlere izin vermemesini isteyebilirsiniz.
İlişkisel veritabanı yönetim sistemleri (RDBMS), kısıtlamalarla bir tabloya hangi verilerin ekleneceğini kontrol etmenize olanak tanır. Kısıtlama, bir veya daha fazla sütuna veya tüm tabloya uygulanan ve bir ifade aracılığıyla tablonun verilerinde yapılabilecek değişiklikleri sınırlayan özel bir kuraldır. SOKMAK, GÜNCELLEME, veya SİLMEK Sınırlar.
Bu makalede, kısıtlamaların ne olduğu ve RDBMS'de nasıl kullanıldığı ayrıntılı olarak incelenmektedir. Ayrıca, SQL standardında tanımlanan beş kısıtlamanın her biri ele alınmakta ve ilgili işlevler açıklanmaktadır.
Sınırlamalar nelerdir?
SQL'de kısıtlama, bir sütuna veya tabloya uygulanan ve içine eklenebilecek verileri sınırlayan herhangi bir kuraldır. Tabloda depolanan verileri değiştiren bir işlem (örneğin INSERT, UPDATE veya DELETE ifadesi) gerçekleştirmeye çalıştığınızda, RDBMS bu verilerin mevcut kısıtlamaları ihlal edip etmediğini test eder ve ihlal ediyorsa bir hata döndürür.
Veritabanı yöneticileri, veritabanının tanımlanmış bir dizi iş kuralına uymasını sağlamak için genellikle kısıtlamalara güvenir. Bir veritabanı bağlamında, iş kuralı, bir işletmenin veya başka bir kuruluşun izlediği ve verilerinin uyması gereken herhangi bir politika veya prosedürdür. Örneğin, bir müşterinin mağazasının envanterini kataloglayan bir veritabanı oluşturduğunuzu varsayalım. Müşteri her ürün kaydının benzersiz bir kimlik numarasına sahip olması gerektiğini belirtirse, bu sütundaki iki girdinin aynı olmamasını sağlayan BENZERSİZ kısıtlamalı bir sütun oluşturabilirsiniz.
Kısıtlamalar, veri bütünlüğünün korunmasında da faydalıdır. Veri bütünlüğü, belirli kullanım durumlarına bağlı olarak, bir veritabanında tutulan verilerin genel doğruluğunu, tutarlılığını ve rasyonalitesini tanımlamak için sıklıkla kullanılan geniş bir terimdir. Bir veritabanındaki tablolar genellikle birbiriyle ilişkilidir ve bir tablodaki sütunlar başka bir tablodaki değerlere bağlıdır. Veri girişi genellikle insan hatasına açık olduğundan, bu gibi durumlarda kısıtlamalar faydalıdır, çünkü hatalı girilen verilerin bu ilişkileri etkileyip veritabanı verilerinin bütünlüğünü tehlikeye atmamasını sağlayabilirler.
İki tablodan oluşan bir veritabanı tasarladığınızı düşünün: Biri bir okuldaki mevcut öğrencileri, diğeri ise o okulun basketbol takımı üyelerini listelemek için. Basketbol takımı tablosundaki, okul tablosundaki bir sütuna referans veren bir sütuna yabancı anahtar kısıtlaması uygulayabilirsiniz. Bu, takım tablosundaki her girdinin öğrenciler tablosundaki bir girdiye referans vermesini gerektirerek iki tablo arasında bir ilişki kurar.
Kullanıcılar, bir tabloyu ilk oluşturduklarında kısıtlamaları tanımlar veya tabloda bulunan verilerle çakışmadıkları sürece ALTER TABLE ifadesiyle daha sonra ekleyebilirler. Bir kısıtlama oluşturduğunuzda, veritabanı sistemi kısıtlama için otomatik olarak bir ad oluşturur, ancak çoğu SQL uygulamasında her kısıtlama için özel bir ad ekleyebilirsiniz. Bu adlar, değiştirildiğinde veya kaldırıldığında ALTER TABLE ifadelerindeki kısıtlamalara atıfta bulunmak için kullanılır.
SQL standardı resmi olarak yalnızca beş kısıtlamayı tanımlar:
- Birincil anahtar
- Yabancı anahtar
- Eşsiz
- Gözden geçirmek
- Boş değil.
Artık kısıtlamaların nasıl kullanıldığına dair genel bir anlayışa sahip olduğunuza göre, bu beş kısıtlamanın her birine daha yakından bakalım.
Birincil anahtar
PRIMARY KEY kısıtlaması, belirli bir sütundaki her girdinin benzersiz ve NULL olmamasını gerektirir ve bu sayede tabloda yer alan her bir satırı tanımlamak için bu sütunu kullanabilirsiniz.
İlişkisel modelde anahtar, bir tablodaki her değerin benzersiz olduğu ve herhangi bir NULL değer içermediği garanti edilen bir sütun veya sütun kümesidir. Birincil anahtar, değerleri bir tablodaki tek tek satırları tanımlamak için kullanılan özel bir anahtardır ve birincil anahtarı oluşturan sütun veya sütunlar, tabloyu veritabanının geri kalanında tanımlamak için kullanılabilir.
İlişkisel veritabanlarının önemli yönlerinden biri de budur: Birincil anahtar sayesinde kullanıcıların verilerinin fiziksel olarak bir makinede saklandığını bilmelerine gerek kalmaz ve DBMS'leri her kaydı takip edip anında alabilir. Bu da kayıtların belirli bir mantıksal sırasının olmadığı ve kullanıcıların verilerini istedikleri sırayla veya istedikleri filtreyle alabilecekleri anlamına gelir.
SQL'de, özünde UNIQUE ve NOT NULL kısıtlamalarının birleşimi olan PRIMARY KEY kısıtlamasıyla birincil anahtar oluşturabilirsiniz. Birincil anahtar tanımlandıktan sonra, DBMS otomatik olarak bununla ilişkili bir dizin oluşturur. Dizin, bir tablodan verilerin daha hızlı alınmasına yardımcı olan bir veritabanı yapısıdır. Bir ders kitabındaki dizin gibi, sorguların ilgili değerleri bulmak için yalnızca dizinlenmiş sütunun girişlerini incelemesi gerekir. Bu, birincil anahtarın tablodaki her satır için bir tanımlayıcı görevi görmesini sağlar.
Bir tablonun yalnızca bir birincil anahtarı olabilir, ancak normal anahtarlar gibi, birincil anahtar da birden fazla sütundan oluşabilir. Bununla birlikte, birincil anahtarların tanımlayıcı bir özelliği, bir tablodaki her satırı benzersiz şekilde tanımlamak için gereken minimum öznitelik kümesini kullanmalarıdır. Bu fikri örneklemek için, bir okuldaki öğrenciler hakkında aşağıdaki üç sütunu kullanarak bilgi depolayan bir tablo düşünün:
öğrenci kimliği: Her öğrencinin benzersiz kimlik numarasını saklamak için kullanılırilk adı: Her öğrencinin adını tutmak için kullanılırSoy isim: Her öğrencinin soyadını tutmak için kullanılır
Bir okuldaki bazı öğrencilerin aynı adı paylaşması mümkün olabilir ve bu da firstName sütununu birincil anahtar için kötü bir seçim haline getirir. Aynı durum lastName sütunu için de geçerlidir. Hem firstName hem de lastName sütunlarından oluşan bir birincil anahtar işe yarayabilir, ancak iki öğrencinin aynı adı ve soyadını paylaşma olasılığı yine de vardır.
Öğrenci kimliği ve ad veya soyad sütunlarından oluşan bir birincil anahtar işe yarayabilir, ancak her öğrencinin kimlik numarası zaten benzersiz olduğundan, birincil anahtara her bir ad sütununu dahil etmek gereksizdir. Dolayısıyla bu durumda, her satırı tanımlayabilen ve bu nedenle tablonun birincil anahtarı için iyi bir seçim olan minimum öznitelik kümesi yalnızca öğrenci kimliği sütunudur.
Bir anahtar gözlemlenebilir ve kullanılabilir verilerden (yani gerçek dünyadaki varlıkları, olayları veya özellikleri temsil eden verilerden) oluşuyorsa, buna doğal anahtar denir. Anahtar dahili olarak üretiliyorsa ve veritabanının dışında hiçbir şeyi temsil etmiyorsa, vekil veya yapay anahtar olarak adlandırılır. Bazı veritabanı sistemleri, görünüşte sabit olan veri noktalarının bile öngörülemeyen şekillerde değişebileceği için doğal anahtarların kullanılmasını önermez.
Yabancı anahtar
FOREIGN KEY kısıtlaması, belirli bir sütundaki her girdinin başka bir tablodaki belirli bir sütunda zaten mevcut olmasını gerektirir.
Birbiriyle ilişkilendirmek istediğiniz iki tablonuz varsa, bunu yapmanın bir yolu, FOREIGN KEY kısıtlamasıyla bir yabancı anahtar tanımlamaktır. Yabancı anahtar, bir tablodaki ("alt" tablo) değerleri başka bir tablodaki ("üst tablo") bir anahtardan gelen bir sütundur. Bu, iki tablo arasındaki ilişkiyi ifade etmenin bir yoludur: Bir FOREIGN KEY kısıtlaması, uygulandığı sütundaki değerlerin, başvurduğu sütunda da bulunmasını gerektirir.
Aşağıdaki diyagram, iki tablo arasındaki böyle bir ilişkiyi göstermektedir: Biri şirket çalışanları hakkında bilgi kaydetmek için kullanılırken, diğeri şirketin satışlarını takip etmek için kullanılmaktadır. Bu örnekte, EMPLOYEES tablosunun birincil anahtarı, SALES tablosunun yabancı anahtarı tarafından referans alınmaktadır:
Alt tabloya bir kayıt eklemeye çalışırsanız ve yabancı anahtar sütununa girilen değer, ana tablonun birincil anahtarında mevcut değilse, ekleme ifadesi geçersiz olur. Bu, her iki tablodaki satırlar her zaman doğru şekilde ilişkili olduğundan, ilişki düzeyinde bütünlüğün korunmasına yardımcı olur.
Çoğu zaman, bir tablonun yabancı anahtarı ana tablonun birincil anahtarıdır, ancak bu her zaman böyle değildir. Çoğu RDBMS'de, ana tabloda UNIQUE veya PRIMARY KEY kısıtlaması olan herhangi bir sütuna, alt tablonun yabancı anahtarıyla başvurulabilir.
Eşsiz
UNIQUE kısıtı, belirtilen sütuna herhangi bir yinelenen değerin eklenmesini engeller.
Adından da anlaşılacağı gibi, UNIQUE kısıtlaması, belirli bir sütundaki her girdinin benzersiz bir değer olmasını gerektirir. Sütunda zaten görünen bir değeri ekleme girişimi hatayla sonuçlanır.
UNIQUE kısıtlamaları, tablolar arasında birebir ilişkileri zorunlu kılmak için kullanışlıdır. Daha önce de belirtildiği gibi, bir yabancı anahtar kullanarak iki tablo arasında ilişki kurabilirsiniz, ancak tablolar arasında çeşitli ilişki türleri bulunabilir:
Ana tablodaki satırlar, alt tablodaki yalnızca bir satıra karşılık geliyorsa iki tablo arasında birebir ilişki olduğu söylenir.یک به یکBirden çoğa: Çoktan-herkese ilişkisinde, ana tablodaki bir satır, alt tablodaki birden fazla satıra ilişkin olabilir, ancak alt tablodaki her satır, ana tablodaki yalnızca bir satıra ilişkin olabilir.Kaç tane?: Eğer ana tablodaki satırlar, alt tablodaki birden fazla satırla ilişkilendirilebiliyorsa ve bunun tersi de geçerliyse, bu iki satır arasında çoktan çoğa ilişki olduğu söylenir.
FOREIGN KEY kısıtlaması uygulanmış bir sütuna UNIQUE kısıtlaması ekleyerek, ana tablodaki her girdinin alt tabloda yalnızca bir kez görünmesini sağlayabilir, böylece iki tablo arasında birebir ilişki kurabilirsiniz.
UNIQUE kısıtlamalarını hem tablo düzeyinde hem de sütun düzeyinde tanımlayabileceğinizi unutmayın. Tablo düzeyinde tanımlandığında, bir UNIQUE kısıtlaması birden fazla sütuna uygulanabilir. Bu gibi durumlarda, kısıtlamadaki her sütunda yinelenen değerler olabilir, ancak her satırda kısıtlanan sütunlarda benzersiz bir değer kombinasyonu bulunmalıdır.
Gözden geçirmek
Bir CHECK kısıtlaması, bir sütuna girilen herhangi bir değerin karşılaması gereken bir koşulu, yani öngörüyü tanımlar.
CHECK kısıtlaması yordamları, TRUE, FALSE veya potansiyel olarak bilinmeyen olarak değerlendirilebilen bir ifade olarak yazılır. Bir CHECK kısıtlamasına bir değer girmeye çalışırsanız ve bu değer ifadenin TRUE veya bilinmeyen olarak değerlendirilmesine neden olursa (bu, NULL değerler için geçerlidir), işlem başarılı olur. Ancak, ifade FALSE olarak değerlendirilirse, işlem başarısız olur.
CHECK yordamları, belirli bir sütunda izin verilen veri aralığını sınırlamak için genellikle matematiksel bir karşılaştırma operatörüne (örneğin <, >, <=, VEYA >=) dayanır. Örneğin, CHECK kısıtlamalarının yaygın kullanımlarından biri, aşağıdaki örnekte olduğu gibi, negatif bir değerin mantıklı olmayacağı durumlarda bazı sütunlarda negatif değerlerin tutulmasını önlemektir.
Bu CREATE TABLE ifadesi, her ürünün adı, kimlik numarası ve fiyatı için sütunlar içeren productInfo adlı bir tablo oluşturur. Bir ürünün negatif bir fiyata sahip olması mantıklı olmadığından, bu ifade yalnızca pozitif değerlere sahip olmasını sağlamak için fiyat sütununa bir CHECK kısıtlaması uygular:
CREATE TABLE productInfo (
productID int,
name varchar(30),
price decimal(4,2)
CHECK (price > 0)
);Her CHECK yordamı matematiksel karşılaştırma operatörü kullanmamalıdır. Genellikle, bir kontrol yordamında doğru, yanlış veya bilinmeyen olarak değerlendirilebilen herhangi bir SQL operatörünü kullanabilirsiniz; LIKE, BETWEEN, IS NOT NULL vb. Bazı SQL uygulamaları, bir CHECK yordamına alt sorgu eklemenize bile izin verir (tümü değil). Ancak, çoğu uygulamanın bir ifadede başka bir tabloya başvurmanıza izin vermediğini unutmayın.
Boş değil.
NOT NULL kısıtı, belirtilen sütuna herhangi bir NULL değerinin eklenmesini engeller.
Çoğu SQL uygulamasında, bir veri satırı ekler ancak belirli bir sütun için bir değer belirtmezseniz, veritabanı sistemi varsayılan olarak eksik verileri NULL olarak gösterir. SQL'de NULL, bilinmeyen, eksik veya belirtilmemiş bir değeri temsil etmek için kullanılan özel bir anahtar sözcüktür. Ancak NULL, bir değerin kendisi değil, bilinmeyen bir değerin durumudur.
Bu farkı açıklamak için, bir yetenek ajansında müşterileri takip etmek için kullanılan ve her müşterinin adı ve soyadı için sütunlar içeren bir tablo düşünün. Bir müşteri "Cher", "Usher" veya "Beyoncé" gibi tek bir ad kullanıyorsa, veritabanı yöneticisi ad sütununa yalnızca bir ad girebilir ve bu da DBMS'nin soyad sütununa NULL eklemesine neden olur. Veritabanı, bir müşterinin soyadını tam anlamıyla "null" olarak değerlendirmez. Bu, yalnızca o satırdaki soyadı sütununun değerinin bilinmediği veya alanın o belirli kayıt için geçerli olmadığı anlamına gelir.
Adından da anlaşılacağı gibi, NOT NULL kısıtlaması, belirtilen sütundaki herhangi bir değerin NULL olmasını engeller. Bu, NOT NULL kısıtlaması olan herhangi bir sütun için, yeni bir satır eklerken bir değer belirtmeniz gerektiği anlamına gelir. Aksi takdirde, INSERT işlemi başarısız olur.
Sonuç
Kısıtlamalar, yüksek düzeyde veri bütünlüğü ve güvenliğine sahip bir veritabanı tasarlamak isteyen herkes için olmazsa olmaz bir araçtır. Bir sütuna girilen verileri kısıtlayarak, tablolar arasındaki ilişkilerin düzgün bir şekilde korunmasını ve veritabanının amacını tanımlayan iş kurallarına uymasını sağlayabilirsiniz.










