Birincil Anahtar ve Yabancı Anahtar SQLite Örneklerle
⚡ Akıllı Özet
Birincil anahtarlar ve yabancı anahtarlar SQLite Her satırı benzersiz bir şekilde tanımlayarak ve ilgili tabloları birbirine bağlayarak veri bütünlüğünü sağlamak, referans verilen değerlerin her zaman mevcut olmasını garanti etmek ve ilişkisel bir veritabanında yinelenen, boş veya yetim kayıtların oluşmasını önlemek.
Aşağıdaki bölümler açıklamaktadır. SQLite Kısıtlamaları ayrıntılı olarak ele alacağız; tabloları tanımlayan ve birbirine bağlayan birincil anahtar (PRIMARY KEY) ve yabancı anahtar (FOREIGN KEY) ile başlayıp, her sütundaki verileri doğrulayan boş kalmama (NOT NULL), varsayılan değer (DEFAULT), benzersizlik (UNIQUE) ve kontrol (CHECK) kurallarını kapsayacağız.
SQLite Kısıtlamalar
Sütun kısıtlamaları, verilerin doğruluğunu sağlamak amacıyla bir sütuna eklenen değerler üzerinde kurallar uygular. Bu kısıtlamalar, tablo oluşturulurken sütun tanımı içinde tanımlanır. Yinelenen değerler, boş değerler veya ilgili bir tabloda bulunmayan değerler gibi belirlediğiniz kuralları ihlal eden değerleri reddederek depolanan verilerin tutarlı ve doğru kalmasını sağlarlar.
SQLite Birincil anahtar
Birincil anahtar sütunundaki tüm değerler benzersiz olmalı ve boş (null) olmamalıdır. Birincil anahtar, tablodaki her satırı benzersiz şekilde tanımlar.
Birincil anahtar yalnızca bir sütuna veya sütunların bir kombinasyonuna uygulanabilir. İkinci durumda, sütun değerlerinin kombinasyonu tablonun tüm satırları için benzersiz olmalıdır.
Sözdizimi:
Bir tabloda birincil anahtar tanımlamanın birkaç farklı yolu vardır:
Sütun tanımının kendisinde:
ColumnName INTEGER NOT NULL PRIMARY KEY;
Ayrı bir tanım olarak:
PRIMARY KEY(ColumnName);
Birincil anahtar olarak sütunların bir birleşimini oluşturmak için:
PRIMARY KEY(ColumnName1, ColumnName2);
SQLite NOT NULL, DEFAULT, UNIQUE ve CHECK Kısıtlamaları
Birincil anahtarın yanı sıra, SQLite Bu, bir tabloya girilen değerleri doğrulayan çeşitli sütun kısıtlamaları sağlar. NOT NULL, DEFAULT, UNIQUE ve CHECK kısıtlamalarının her biri sütun tanımında tanımlanır ve her biri sütunun belirli bir kuralını uygular. veri tipi ve değerler.
NOT NULL Kısıtlaması
MKS SQLite NOT NULL kısıtlaması, bir sütunun boş değer almasını engeller:
ColumnName INTEGER NOT NULL;
VARSAYILAN Kısıtlama
İle SQLite DEFAULT kısıtlaması, bir sütuna herhangi bir değer girmezseniz, onun yerine varsayılan değerin girilmesini sağlar.
Örneğin:
ColumnName INTEGER DEFAULT 0;
Bir INSERT sorgusu yazarken o sütun için herhangi bir değer belirtmezseniz, sütun 0 değerine sahip olacaktır.
BENZERSİZ Kısıtlama
MKS SQLite UNIQUE kısıtlaması, sütundaki tüm değerler arasında yinelenen değerlerin olmasını engeller.
Örneğin:
EmployeeId INTEGER NOT NULL UNIQUE;
Bu, "EmployeeId" değerinin benzersiz olmasını sağlar; yinelenen değerlere izin verilmez. Bunun yalnızca "EmployeeId" sütunundaki değerler için geçerli olduğunu unutmayın.
Kısıtlamayı KONTROL EDİN
MKS SQLite CHECK kısıtlaması, eklenen bir değerin kontrol edilmesi için bir koşul belirler. Değer koşula uymuyorsa, eklenmeyecektir.
Quantity INTEGER NOT NULL CHECK(Quantity > 10);
"Miktar" sütununa 10'dan küçük bir değer giremezsiniz.
SQLite Yabancı anahtar
MKS SQLite Yabancı anahtar, bir tabloda bulunan bir değerin, yabancı anahtarın tanımlandığı ilk tabloyla ilişkisi olan başka bir tabloda da mevcut olup olmadığını doğrulayan bir kısıtlamadır.
Birden fazla tabloyla çalışırken, iki tablonun ortak bir sütun aracılığıyla birbirine bağlı olduğu durumlar vardır. Bunlardan birine girilen değerin diğer tablonun sütununda da bulunmasını sağlamak istiyorsanız, ortak sütun üzerinde yabancı anahtar kısıtlaması kullanmalısınız.
Bu durumda, o sütuna bir değer eklemeye çalıştığınızda, yabancı anahtar eklenen değerin referans verilen tablonun sütununda mevcut olmasını sağlayacaktır.
Yabancı anahtar kısıtlamalarının varsayılan olarak etkinleştirilmediğini unutmayın. SQLiteÖncelikle aşağıdaki komutu çalıştırarak bunları etkinleştirmeniz gerekiyor:
PRAGMA foreign_keys = ON;
Yabancı anahtar kısıtlamaları getirildi SQLite 3.6.19 sürümünden başlayarak.
Örnek SQLite Yabancı anahtar
Öğrenciler ve Bölümler olmak üzere iki tablomuz olduğunu varsayalım.
Öğrenciler tablosunda öğrencilerin listesi, Bölümler tablosunda ise bölümlerin listesi bulunmaktadır. Her öğrenci bir bölüme aittir; yani her öğrencinin bir departmentId sütunu vardır.
Şimdi, yabancı anahtar kısıtlamasının, Öğrenciler tablosundaki bölüm kimliğinin değerinin Bölümler tablosunda da mevcut olmasını sağlamada nasıl yardımcı olabileceğini göreceğiz.
Dolayısıyla, Öğrenciler tablosundaki DepartmentId alanına yabancı anahtar kısıtlaması eklersek, eklenen her departmentId'nin Bölümler tablosunda da bulunması gerekir.
CREATE TABLE [Departments] ( [DepartmentId] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, [DepartmentName] NVARCHAR(50) NULL ); CREATE TABLE [Students] ( [StudentId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, [StudentName] NVARCHAR(50) NULL, [DepartmentId] INTEGER NOT NULL, [DateOfBirth] DATE NULL, FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId) );
Yabancı anahtar kısıtlamalarının, bir tabloyla ilişkisi olan başka bir tabloya tanımsız bir öğenin veya değerin eklenmesini nasıl engelleyebileceğini incelemek için aşağıdaki örneğe bakacağız.
Bu örnekte, Bölümler tablosu ile Öğrenciler tablosu arasında yabancı anahtar ilişkisi bulunmaktadır; bu nedenle Öğrenciler tablosuna eklenen herhangi bir departmentId değeri Bölümler tablosunda da mevcut olmalıdır. Bölümler tablosunda bulunmayan bir departmentId değeri eklemeye çalışırsanız, yabancı anahtar kısıtlaması bunu yapmanızı engelleyecektir.
Bölümler tablosuna "BT" ve "Sanat" olmak üzere iki bölüm ekleyelim. INSERT sorguları:
INSERT INTO Departments VALUES(1, 'IT'); INSERT INTO Departments VALUES(2, 'Arts');
Bu iki ifade, Departmanlar tablosuna iki departman eklemelidir. İki değerin eklendiğini doğrulamak için daha sonra “SELECT * FROM Departments” sorgusunu çalıştırabilirsiniz:
Ardından, Bölümler tablosunda bulunmayan bir departmentId ile yeni bir öğrenci eklemeyi deneyin:
INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);
Satır eklenmeyecek ve şu hatayı alacaksınız: YABANCI ANAHTAR kısıtlaması başarısız oldu.
Birincil Anahtar ve Yabancı Anahtar Arasındaki Fark SQLite
Birincil anahtarlar ve yabancı anahtarlar, veri bütünlüğünü korumaya yardımcı olur ancak farklı roller üstlenirler. Birincil anahtar, tek bir tablo içindeki satırları tanımlarken, yabancı anahtar iki ilişkili tablodaki satırları birbirine bağlar. Aşağıdaki tablo, temel farklılıkları özetlemektedir.
| Temel | Birincil anahtar | Yabancı anahtar |
|---|---|---|
| Amaç | Tablodaki her satırı benzersiz bir şekilde tanımlar. | İki tabloyu birbirine bağlamak için başka bir tablonun birincil anahtarına başvurur. |
| Benzersizlik | Değerler benzersiz olmalıdır. | Değerler tekrarlanabilir, bu nedenle birçok alt satır aynı üst satırı paylaşabilir. |
| Boş değerler | Boş olamaz | İlişki isteğe bağlı olduğunda null olabilir. |
| Masa başına düşen adet | Tablo başına yalnızca birincil anahtar bulunabilir. | Bir tabloda birden fazla yabancı anahtar bulunabilir. |
| Endeksleme | Otomatik olarak indekslendi | Otomatik olarak indekslenmez; performans için bir tane ekleyin. |
Öğrenciler ve Bölümler örneğinde, DepartmentId, Bölümler tablosunun birincil anahtarı ve Öğrenciler tablosunun yabancı anahtarıdır; bu da her öğrenciyi geçerli bir bölüme bağlayan unsurdur.
SQLite Bileşik Birincil Anahtar
Birleşik birincil anahtar, iki veya daha fazla sütundan oluşan birincil anahtardır. Tek başına hiçbir sütun benzersiz olmadığında, ancak sütunların birleşimi her satır için benzersiz olduğunda kullanılır. SQLite Birleştirilmiş değerleri tek bir anahtar olarak ele alır.
Örneğin, bir kayıt tablosu aynı öğrencinin birçok derse ve aynı dersin birçok öğrenciye kayıtlı olmasına izin verebilir, ancak her öğrenci-ders çifti yalnızca bir kez görünmelidir:
CREATE TABLE Enrollments ( StudentId INTEGER NOT NULL, CourseId INTEGER NOT NULL, Grade TEXT, PRIMARY KEY (StudentId, CourseId) );
Burada StudentId veya CourseId tek başına benzersiz değildir, ancak (StudentId, CourseId) çifti benzersizdir, bu nedenle aynı öğrenci aynı derse iki kez kayıt olamaz. Bileşik anahtar kullanırken aşağıdaki noktalara dikkat edin:
- Tek bir sütun bir satırı benzersiz şekilde tanımlayamadığında bileşik anahtar kullanın.
- Bileşik anahtardaki her sütun birincil anahtar kurallarına uyar, bu nedenle birleştirilmiş değer benzersiz olmalı ve boş (null) olmamalıdır.
- Birleşik anahtar, tek bir sütun tanımının içinde değil, ayrı bir tablo düzeyinde PRIMARY KEY yan tümcesi olarak yazılır.
SQLite Yabancı Anahtar İşlemleri: SİLME İŞLEMİ VE GÜNCELLEME İŞLEMİ
Yabancı anahtar, referans verdikleri üst satır silindiğinde veya güncellendiğinde alt satırlara ne olacağını da kontrol edebilir. Bu referanssal işlemler, yabancı anahtarı tanımlarken ON DELETE ve ON UPDATE yan tümceleriyle eklenir. SQLite beş eylemi destekler:
- HİÇBİR EYLEM — Varsayılan işlem, alt satırlar hala üst satıra referans veriyorsa hata verir.
- KISITLAMAK — diğer herhangi bir değişiklik uygulanmadan önce silme veya güncelleme işleminin hemen gerçekleşmesini engeller.
- BOŞ AYARLA — alt yabancı anahtar sütununu boş değere ayarlar.
- VARSAYILANA AYARLA — alt yabancı anahtar sütununu tanımlanmış varsayılan değerine ayarlar.
- CASCADE — aynı değişikliği alt satırlara da uygular, bu nedenle bir üst satırı silmek alt satırlarını da siler.
Aşağıdaki örnek, Öğrenciler tablosunu yeniden oluşturarak bir bölümün silinmesinin o bölüme ait öğrencilerin de otomatik olarak silinmesini ve bir bölüm kimliğinin güncellenmesinin ilgili öğrencilerin güncellenmesini sağlar:
CREATE TABLE Students ( StudentId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, StudentName NVARCHAR(50) NULL, DepartmentId INTEGER NOT NULL, FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId) ON DELETE CASCADE ON UPDATE CASCADE );
Unutmayın ki, referans işlemleri yalnızca yabancı anahtar desteği açık olduğunda çalışır, bu nedenle her bağlantının başında PRAGMA foreign_keys = ON komutunu çalıştırın. Aksi takdirde, SQLite ON DELETE ve ON UPDATE maddelerini ayrıştırır ancak bunları uygulamaz.



