Verileriniz yalnızca ona güvenebiliyorsanız iyidir. Doğru, güvenilir olduğundan ve veri modelinizi bozmadığından emin olmak için veritabanı kısıtlamalarını kullanın.
Temel Çıkarımlar
- Veri bütünlüğünü korumak ve veritabanınızda tekdüzelik sağlamak için SQL kısıtlamalarını kullanın. NOT NULL kısıtlaması, sütunları NULL değerlerini reddetmeye zorlar.
- Bir sütun veya sütun kümesindeki değerlerin benzersizliğini sağlamak için birincil anahtar kısıtlamalarını uygulayın. Bu, bir veritabanı tablosundaki kayıtların kopyalanmasını önler.
- Yabancı anahtar kısıtlamaları tablolar arasında ilişki kurar ve aralarındaki bağlantıları bozacak eylemleri önler. Alt tablodaki bir kaydın üst tabloya referans vermesini sağlarlar.
Bir veritabanı birçok uygulama için gereklidir, ancak verileri depolamak ve işlemek için yönergeleriniz yoksa karmaşık hale gelebilir.
SQL kısıtlamaları, verileri bir tabloda depolamak için kuralları belirtir. Kısıtlamalar ayarladığınızda, bu kuralları ihlal eden verileri depolamaya çalışırsanız veritabanı hata verecektir. Kısıtlamalar veri bütünlüğünü korumaya ve veritabanınızda tekdüzelik sağlamaya yardımcı olur.
Kullanabileceğiniz çeşitli SQL kısıtlama türleri vardır; işte en kullanışlı olanlardan bazıları.
1. NOT NULL Kısıtlaması
Veritabanı sütunları varsayılan olarak NULL değerlerine sahip verileri kabul eder. NULL aslında hiçbir değerin bulunmadığı anlamına gelir. NOT NULL kısıtlaması, bir sütunu NULL değerlerini reddetmeye zorlar.
Bu kısıtlama, her sütunun bir değer içermesini sağlar. NOT NULL kısıtlamasına sahip herhangi bir sütun için veri sağlamadan veritabanına kayıt ekleyemezsiniz.
Bir örneği ele alalım Müşteriler masa. Her müşteri hakkında, adı gibi, kayıt altına alınmasını istediğiniz bazı gerekli ayrıntılar vardır. Müşterilerin bu bilgileri sağladığından emin olmak için zorunlu alanlara NOT NULL kısıtlamasını ekleyin.
Burada NOT NULL kısıtlamasını nasıl kullanabileceğinizi gösteren bir örnek verilmiştir. PostgreSQL veritabanı:
CREATETABLE Customers (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Mobile_No int NOT NULL,
Age int
);
Müşteri kaydını eklemeyi denerseniz Yaş alanı, veritabanı bunu hatasız olarak kabul edecektir:
INSERTINTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 0723000000);
Ancak, kayıt olmadan bir kayıt eklemeyi denerseniz İlk adı alanı, veritabanı bir hata mesajıyla reddedecektir:
ERROR: null value in column "firstname" violates not-null constraint
Detail: Failing row contains (123456, Dior, null, 723000000, null).
2. PRIMARY KEY Kısıtlaması
ANAHTAR, veritabanı sistemlerindeki bir tablonun tuple'ını (veya kaydını) tanımlayan bir sütuna veya alana ayarlanmış benzersiz bir özniteliktir. PRIMARY KEY kısıtlaması, bir sütun veya sütun kümesindeki değerlerin benzersizliğini sağlar. Bir satırda benzersiz bir tanımlayıcı görevi görerek bir veritabanı tablosunda yinelenen kayıtları önler.
Birincil anahtarlar benzersiz değerler içerir ve NULL değerler içeremez. Her biri SQL veritabanı tablosu yalnızca bir birincil anahtara sahip olmalıdır. PRIMARY KEY tek veya birden fazla sütuna sahip olabilir.
Örneğin, müşteri kayıtlarından oluşan bir veritabanı oluşturuyorsunuz. Her müşterinin kimlik numarasını diğerlerinden farklı şekilde girmesi gerekir. Müşterilerinizden hiçbirinin aynı kimlik numarasına sahip olmadığından emin olmak için birincil anahtar kısıtlamasını uygulayabilirsiniz.
Aşağıdaki kod, MySQL veritabanına nasıl birincil anahtar kısıtlaması ekleyebileceğinizi gösterir:
CREATETABLE Customers (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
PRIMARY KEY (ID)
);
Bir kullanıcı benzer kimliğe sahip başka bir kayıt girerse veritabanı bu değeri kabul etmeyecektir. Bunun yerine çoğaltmayı belirten bir hata verecektir. Aşağıdaki örnekte kullanıcı aynı kimliğe sahip iki kayıt eklemeye çalışır:
INSERTINTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'John', 'Doe', 35 );
INSERTINTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'Mary', 'Jane', 35 );
Veritabanı bir hata mesajı gösterecektir:
Duplicate entry '1' for key 'PRIMARY'
Ancak ikinci müşterinin kimliğini değiştirirseniz veritabanı girişi kabul eder. Bu nedenle birincil anahtar, müşteri kayıtlarınızda mükerrer kimliklerin bulunmamasını sağlar.
3. YABANCI ANAHTAR Kısıtlaması
Yabancı anahtarlar iki tablo arasında ilişki kurar. Bir tablodaki bir alana/sütuna, başka bir tablodaki birincil anahtara başvuran bir yabancı anahtar ekleyebilirsiniz.
Birincil anahtarın bulunduğu tablo ana tablo, yabancı anahtarın bulunduğu tablo ise alt tablodur. Bu durumda, ana tabloya referans olmadan alt tabloda bir kayıt bulunamaz.
Yabancı anahtar kısıtlaması tablolar arasındaki bağlantıları bozacak eylemleri engeller. Örneğin, yapamazsınız DÜŞÜRMEK bir tablo diğerine yabancı anahtarla bağlanıyorsa. Her iki tabloyu da aynı anda bırakmanız gerekecek.
Birincil anahtarın aksine, yabancı anahtarı çoğaltabilir ve tek bir tabloda birden fazla bulundurabilirsiniz. Yabancı anahtar değerleri de olabilir HÜKÜMSÜZ. Aşağıdaki örnekte, şunu kullanmanız gerekir: Müşteri Kimliği bir sipariş oluşturmak için.
CREATETABLE Customers (
customer_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50)
);CREATETABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
);INSERTINTO Customers(customer_id, first_name, last_name)
VALUES (1, 'Christian', 'Dior');
INSERTINTO Orders(order_id, customer_id, order_date)
VALUES (1, 1, '2023-08-07');
Mevcut bir sipariş olmadan bir sipariş oluşturmayı denerseniz Müşteri Kimliğiveritabanı bir hata mesajı gösteriyor:
Cannot add or update a child row: a foreign key constraint fails
(`db_9_4ee205c`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY
(`customer_id`) REFERENCES `customers` (`customer_id`))
4. BENZERSİZ Kısıtlama
Bu kısıtlama, belirli bir sütun için iki satırın aynı değerlere sahip olmamasını sağlar. Birincil anahtarlar gibi benzersiz bir kısıtlama da veri bütünlüğünü korur ve yinelenen girişleri önler. UNIQUE kısıtlaması olmayan, kötü tasarlanmış bir veritabanıyla çalışıyorsanız, kopyaları bul ve sil.
Birincil anahtarların aksine, bir tabloda birçok UNIQUE kısıtlamanız olabilir. Örneğin, bir oluştururken Müşteriler tablosunda benzersiz kimliklere ve telefon numaralarına sahip olmak isteyebilirsiniz. MySQL sunucusunu kullanarak böyle bir kısıtlama eklemek için şu sözdizimini kullanın:
CREATETABLE Customers (
ID int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Mobile_No BIGINT UNIQUE
);
Veritabanına aynı cep telefonu numarasına sahip kayıtlar eklerseniz, bir hata mesajı görünecektir.
INSERTINTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 254000000 );
INSERTINTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (7891011, 'Dedan', 'Kimathi', 254000000 );
Hata mesajı şunun gibi olacaktır:
Duplicate entry '254000000' for key 'Mobile_No'
Bu BENZERSİZ kısıtlama, veritabanının aynı kimliklere veya cep telefonu numaralarına sahip müşterilere sahip olmamasını sağlar.
5. Kısıtlamayı KONTROL EDİN
CHECK kısıtlaması bir sütuna konulan değer aralığını sınırlar. Bir sütuna CHECK kısıtlaması eklemek, o sütun için yalnızca belirtilen değerlere izin verir. Kullanıcının bir tabloya yalnızca geçerli verileri eklemesini sağlayarak veri bütünlüğünü güçlendirir.
CHECK kısıtlaması, belirtilen her satır veya tablo girişi için bir değeri DOĞRU veya BİLİNMİYOR olarak değerlendirmelidir. Değer FALSE ise veritabanı bir hata mesajı görüntüler.
Örneğin, Müşteriler tablosunda yalnızca 18 yaşın üzerindeki müşterilere hizmet vermek isteyebilirsiniz. Reşit olmayan müşterilere hizmet vermediğinizden emin olmak için bir CHECK sınırlaması ekleyebilirsiniz. Kısıtlamayı aşağıdaki kodda gösterildiği gibi PostgreSQL veritabanına ekleyebilirsiniz:
CREATETABLE Customers (
ID int NOT NULL,
Age int CHECK(Age>=18),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Mobile_No BIGINT UNIQUE
);
Şimdi, 18 yaşın altındaki bir müşterinin yaşını eklemeye çalışırsanız:
INSERTINTO Customers (ID, Age, LastName, FirstName, Mobile_No)
VALUES (123456, 15, 'Dior', 'Christian', 1254000000 );
Veritabanı şuna benzer bir hata mesajı gösterecektir:
ERROR: new row for relation "customers" violates check constraint
"customers_age_check"
Detail: Failing row contains (123456, 15, Dior, Christian, 1254000000)
Veritabanlarına SQL Kısıtlamaları Nasıl Eklenir ve Kaldırılır
SQL kısıtlamaları kesin olarak belirlenmemiştir. ALTER TABLE deyimini kullanarak mevcut tablolara kısıtlamalar ekleyebilir veya kaldırabilirsiniz. ALTER ifadesi, veri ihtiyaçlarınıza uygun kısıtlamalarla çalışmanıza olanak tanır.
Bir veritabanını beğeninize göre tasarlamayı öğrenebileceğiniz daha birçok SQL kısıtlaması vardır. Bu makalede listelenenlerle başlayabilirsiniz.