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.

  • 🔑 Birincil anahtar: Birincil anahtar, her satırı benzersiz şekilde tanımlar ve değerleri benzersiz olmalı ve asla boş (null) olmamalıdır.
  • 🧩 Bileşik Anahtar: Tek bir sütunun benzersiz olmadığı durumlarda, iki veya daha fazla sütunun birleştirilmesiyle bileşik birincil anahtar oluşturulur.
  • 🔗 Yabancı anahtar: Yabancı anahtar, üst tablodaki bir anahtara referans verir ve ilişkili tablolar arasında referans bütünlüğünü sağlar.
  • ⚙️ Yaptırım Uygulamasını Etkinleştir: SQLite Yabancı anahtarlar varsayılan olarak devre dışıdır, bu nedenle etkinleştirmek için PRAGMA foreign_keys = ON komutunu çalıştırın.
  • 🧱 Sütun Kısıtlamaları: NOT NULL, DEFAULT, UNIQUE ve CHECK kuralları, değerlerin bir sütuna girmeden önce doğrulanmasını sağlar.
  • 🤖 Yapay Zeka Yardımı: Yapay zekâ destekli metinden SQL'e dönüştürme asistanları ve GitHub Copilot, düz İngilizce metinden anahtar ve kısıtlama SQL'i oluşturur.

Birincil Anahtar ve Yabancı Anahtar SQLite

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:

SELECT sorgusunun sonuçları, BT ve Sanat bölümlerini göstermektedir. SQLite

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.

SQLite FOREIGN KEY kısıtlaması başarısız oldu hatası mesajı

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.

SSS

Evet. Tek bir sütun tam olarak INTEGER PRIMARY KEY olarak tanımlandığında, tablonun yerleşik rowid'inin bir takma adı haline gelir. SQLite Bu anahtar için ayrı bir dizin tutmaz, bu nedenle bu anahtarla yapılan aramalar hızlıdır ve ek depolama alanı kullanmaz.

Eski veritabanları ve 3.6.19 sürümünden önce yazılmış komut dosyalarıyla geriye dönük uyumluluğu korumak için yabancı anahtar zorlaması varsayılan olarak kapalı tutulur. Her veritabanı bağlantısının, PRAGMA foreign_keys = ON komutunu çalıştırmadan önce çalıştırılması gerekir. SQLite Yabancı anahtar kısıtlamalarını kontrol etmeye başlar.

SQLite Birincil anahtarları ve benzersiz sütunları otomatik olarak indeksler, ancak yabancı anahtar sütunlarını indekslemez. Alt sütun her kısıtlama kontrolünde okunduğu için, performans açısından her yabancı anahtar sütununda kendi indeksinizi oluşturmanız önerilir.

Hayır. ALTER TABLE'ı kullan. SQLite Mevcut bir tabloya birincil anahtar veya yabancı anahtar ekleyemezsiniz. Eski tabloyu yeniden adlandırın, anahtarı tanımlanmış yeni bir tablo oluşturun, INSERT SELECT komutuyla satırları yeni tabloya kopyalayın ve ardından eski tabloyu silin.

Basit bir tamsayı birincil anahtar, bir sonraki kimliği mevcut en büyük satır kimliğinin bir üstündeki olarak atar ve silme işlemlerinden sonra kimlikleri yeniden kullanabilir. Otomatik artırma trac`ks`, `sqlite_sequence` içinde şimdiye kadar kullanılan en yüksek kimliktir ve küçük bir performans maliyeti karşılığında hiçbir değeri tekrar kullanmaz.

Bu hata, yabancı anahtar değeri üst tabloda eşleşen bir satıra sahip olmayan bir alt satır eklediğinizde veya güncellediğinizde ya da alt satırları olan bir üst satırı sildiğinizde ortaya çıkar. Öncelikle üst kaydı ekleyin.

Evet. Yapay zekâ destekli metinden SQL'e dönüştürme yardımcıları, tablolarınızın sade İngilizce açıklamalarını PRIMARY KEY ve FOREIGN KEY yan tümcelerine sahip CREATE TABLE ifadelerine dönüştürür. Mevcut şemayı sağlamak doğruluğu artırır ve oluşturulan SQL, gerçek veriler üzerinde çalıştırılmadan önce her zaman gözden geçirilmelidir.

Evet. GitHub Yardımcı Pilotu Bu, PRIMARY KEY, FOREIGN KEY ve diğer kısıtlamaları içeren CREATE TABLE kodunun, aşağıdaki gibi düzenleyicilerde satır içi olarak yer almasını önerir: VS CodeMevcut şemanızı ve geçiş dosyalarınızı okur, bu nedenle otomatik tamamlama işlemleri gerçek tablo ve sütun adlarınızı yeniden kullanır.

Bu yazıyı şu şekilde özetleyin: