Elsődleges kulcs és idegen kulcs be SQLite példákkal

⚡ Okos összefoglaló

Elsődleges kulcsok és idegen kulcsok SQLite Az adatintegritás érvényesítése minden sor egyedi azonosításával és a kapcsolódó táblák összekapcsolásával, biztosítva a hivatkozott értékek állandó létezését, és megakadályozva a duplikált, null vagy árva rekordok kialakulását egy relációs adatbázisban.

  • 🔑 Elsődleges kulcs: Az elsődleges kulcs egyedileg azonosítja az egyes sorokat, és az értékeinek egyedinek kell lenniük, és soha nem lehetnek nullák.
  • 🧩 Összetett kulcs: Két vagy több oszlop kombinálása összetett elsődleges kulcsot alkot, ha egyetlen oszlop sem egyedi.
  • 🔗 Idegen kulcs: Egy idegen kulcs egy szülőtábla kulcsára hivatkozik, és hivatkozási integritást érvényesít a kapcsolódó táblák között.
  • 🇧🇷 Végrehajtás engedélyezése: SQLite alapértelmezés szerint letiltja az idegen kulcsokat, ezért a PRAGMA foreign_keys = ON paranccsal aktiválhatók.
  • 🧱 Oszlopkorlátozások: A NOT NULL, DEFAULT, UNIQUE és CHECK szabályok érvényesítik az értékeket, mielőtt azok egy oszlopba kerülnének.
  • 🤖 AI segítség: A mesterséges intelligenciával működő szöveg-SQL asszisztensek és a GitHub Copilot kulcs- és korlátozó SQL-kódokat generálnak egyszerű angol nyelvből.

Elsődleges kulcs és idegen kulcs be SQLite

Az alábbi részek elmagyarázzák SQLite részletesen ismertetjük a korlátozásokat, kezdve az ELSŐDLEGES KULCS és IDEGEN KULCS-szal, amelyek definiálják és összekapcsolják a táblákat, és kiterjednek a NOT NULL, DEFAULT, UNIQUE és CHECK szabályokra, amelyek érvényesítik az egyes oszlopokban lévő adatokat.

SQLite megszorítások

Az oszlopkorlátozások szabályokat kényszerítenek ki az oszlopba beszúrt értékekre az adatok érvényesítése érdekében. Ezeket a korlátozásokat egy tábla létrehozásakor, az oszlopdefiníción belül definiálják. A tárolt adatok konzisztensek és pontosak azáltal, hogy elutasítják a beállított szabályokat megsértő értékeket, például a duplikált értékeket, a null értékeket vagy a kapcsolódó táblában nem létező értékeket.

SQLite Elsődleges kulcs

Az elsődleges kulcs oszlopában található összes értéknek egyedinek és nem lehet null értékűnek. Az elsődleges kulcs egyedileg azonosítja a tábla minden sorát.

Az elsődleges kulcs alkalmazható csak egy oszlopra vagy oszlopok kombinációjára. Ez utóbbi esetben az oszlopok értékeinek kombinációjának egyedinek kell lennie a tábla összes sorában.

Syntax:

Többféleképpen is definiálhatunk elsődleges kulcsot egy táblában:

Magában az oszlopdefinícióban:

ColumnName INTEGER NOT NULL PRIMARY KEY;

Külön definícióként:

PRIMARY KEY(ColumnName);

Oszlopok kombinációjának létrehozása elsődleges kulcsként:

PRIMARY KEY(ColumnName1, ColumnName2);

SQLite NOT NULL, DEFAULT, UNIQUE és CHECK megszorítások

Az elsődleges kulcson kívül SQLite számos oszlopkorlátozást biztosít, amelyek érvényesítik a táblázatba beírt értékeket. A NOT NULL, DEFAULT, UNIQUE és CHECK korlátozások mindegyike az oszlopdefinícióban van definiálva, és mindegyik egy adott szabályt érvényesít az oszlop értékeire vonatkozóan. adattípus és értékeket.

NOT NULL korlátozás

Az SQLite A NOT NULL megszorítás megakadályozza, hogy egy oszlop null értékű legyen:

ColumnName INTEGER  NOT NULL;

ALAPÉRTELMEZETT kényszer

Aktivitáskövető SQLite ALAPÉRTELMEZETT korlátozás esetén, ha nem szúr be értéket egy oszlopba, akkor az alapértelmezett érték kerül beszúrásra.

Például:

ColumnName INTEGER DEFAULT 0;

Ha egy INSERT utasítást írsz, és nem adsz meg értéket az adott oszlopnak, akkor az oszlop értéke 0 lesz.

EGYEDI korlátozás

Az SQLite Az EGYEDI megkötés megakadályozza az ismétlődő értékeket az oszlop összes értéke között.

Például:

EmployeeId INTEGER NOT NULL UNIQUE;

Ezáltal az „EmployeeId” értékének egyedinek kell lennie; az ismétlődő értékek nem engedélyezettek. Fontos megjegyezni, hogy ez csak az „EmployeeId” oszlop értékeire vonatkozik.

ELLENŐRIZZE a korlátozást

Az SQLite A CHECK megkötés feltételt állít be egy beszúrt érték ellenőrzésére. Ha az érték nem felel meg a feltételnek, akkor nem kerül beszúrásra.

Quantity INTEGER NOT NULL CHECK(Quantity > 10);

A „Mennyiség” oszlopba nem írhat be 10-nél kisebb értéket.

SQLite Idegen kulcs

Az SQLite Az idegen kulcs egy olyan megkötés, amely ellenőrzi egy táblázatban szereplő érték létezését egy másik táblázatban, amely kapcsolatban áll az első táblázattal, amelyben az idegen kulcs definiálva van.

Több táblával való munka során előfordulhatnak olyan esetek, amikor két tábla egy közös oszlopon keresztül kapcsolódik egymáshoz. Ha biztosítani szeretné, hogy az egyikbe beszúrt érték a másik tábla oszlopában is szerepeljen, akkor idegen kulcskorlátozást kell használnia a közös oszlopra.

Ebben az esetben, amikor megpróbálsz beszúrni egy értéket az adott oszlopba, az idegen kulcs biztosítja, hogy a beszúrt érték létezik a hivatkozott tábla oszlopában.

Vegye figyelembe, hogy az idegen kulcsokra vonatkozó korlátozások alapértelmezés szerint nincsenek engedélyezve a következőben: SQLiteElőször engedélyeznie kell őket a következő parancs futtatásával:

PRAGMA foreign_keys = ON;

Az idegen kulcsok megszorításait ben vezették be SQLite a 3.6.19-es verziótól kezdve.

Például az SQLite Idegen kulcs

Tegyük fel, hogy két táblázatunk van: a Hallgatók és a Tanszékek.

A Diákok tábla a diákok listáját tartalmazza, a Tanszékek tábla pedig a tanszékek listáját. Minden diák egy tanszékhez tartozik, azaz minden diáknak van egy tanszékId oszlopa.

Most megnézzük, hogyan lehet hasznos az idegen kulcs korlátozás annak biztosítására, hogy a Tanulók táblában található részlegazonosító értékének léteznie kell a Részlegek táblában.

Tehát, ha idegen kulcs korlátozást hozunk létre a Tanulók táblában a DepartmentId-re, akkor minden beszúrt departmentId-nek szerepelnie kell a Departments táblában.

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)
);

Annak ellenőrzésére, hogy az idegenkulcs-megszorítások hogyan akadályozhatják meg egy nem definiált elem vagy érték beszúrását egy másik táblával kapcsolatban álló táblázatba, a következő példát fogjuk megvizsgálni.

Ebben a példában a Departments tábla idegen kulcs kapcsolatban áll a Students táblával, tehát a Students táblába beszúrt minden departmentId értéknek léteznie kell a Departments táblában. Ha olyan departmentId értéket próbál meg beszúrni, amely nem létezik a Departments táblában, az idegen kulcs korlátozás megakadályozza ezt.

Helyezzünk el két tanszéket, az „IT”-t és a „Bölcsészettudományi”-t a Tanszékek táblázatban a következőképpen: INSERT lekérdezések:

INSERT INTO Departments VALUES(1, 'IT');
INSERT INTO Departments VALUES(2, 'Arts');

A két utasításnak két részleget kell beszúrnia a Departments táblába. A két érték beszúrását a „SELECT * FROM Departments” lekérdezés futtatásával ellenőrizheti:

A SELECT lekérdezés eredménye, amely az informatikai és a művészeti tanszékeket mutatja a következő helyen: SQLite

Ezután próbáljon meg beszúrni egy új hallgatót egy olyan részlegazonosítóval, amely nem létezik a Részlegek táblában:

INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);

A sor nem kerül beszúrásra, és a következő hibaüzenetet kapod: FOREIGN KEY korlátozás sikertelen.

SQLite FOREIGN KEY korlátozás sikertelen hibaüzenet

Különbség az elsődleges kulcs és az idegen kulcs között a SQLite

Az elsődleges kulcsok és az idegen kulcsok egyaránt segítenek megőrizni az adatok integritását, de eltérő szerepet játszanak. Az elsődleges kulcs egyetlen táblázat sorait azonosítja, míg az idegen kulcs két kapcsolódó táblázat sorait összekapcsolja. Az alábbi táblázat összefoglalja a fő különbségeket.

Bázis Elsődleges kulcs Idegen kulcs
Cél Egyedileg azonosítja az egyes sorokat a saját táblázatában Egy másik tábla elsődleges kulcsára hivatkozik, hogy összekapcsolja azokat
egyediség Az értékeknek egyedieknek kell lenniük Az értékek ismétlődhetnek, így sok gyermeksor osztozhat egy szülősoron
Null értékek Nem lehet üres Lehet null, ha a kapcsolat opcionális
Szám asztalonként Csak egy elsődleges kulcs táblánként Egy táblázat több idegen kulcsot is tartalmazhat
Indexelés Automatikusan indexelve Nincs automatikusan indexelve; adjon hozzá egyet a teljesítmény érdekében

A Hallgatók és Tanszékek példában a TanszékId a Tanszékek tábla elsődleges kulcsa, és egy idegen kulcs a Hallgatók táblában, amely az egyes hallgatókat egy érvényes tanszékhez köti.

SQLite Összetett elsődleges kulcs

Az összetett elsődleges kulcs két vagy több oszlopból álló elsődleges kulcs. Akkor használjuk, ha egyetlen oszlop sem egyedi önmagában, de az oszlopok kombinációja minden sor esetében egyedi. SQLite az egyesített értékeket egyetlen kulcsként kezeli.

Például egy beiratkozási táblázat engedélyezheti ugyanazt a hallgatót sok kurzuson, és ugyanazt a kurzust sok hallgató számára, mégis minden hallgató-kurzus páros csak egyszer szerepelhet:

CREATE TABLE Enrollments (
	StudentId INTEGER NOT NULL,
	CourseId INTEGER NOT NULL,
	Grade TEXT,
	PRIMARY KEY (StudentId, CourseId)
);

Itt sem a StudentId, sem a CourseId nem egyedi önmagában, de a (StudentId, CourseId) páros egyedi, tehát ugyanaz a hallgató nem iratkozhat be kétszer ugyanarra a kurzusra. Összetett kulcs használatakor a következőkre kell figyelni:

  • Használjon összetett kulcsot, ha egyetlen oszlop nem tud egyértelműen azonosítani egy sort.
  • Az összetett kulcs minden oszlopa követi az elsődleges kulcs szabályait, így az egyesített értéknek egyedinek és nem null értékűnek kell lennie.
  • Az összetett kulcsot különálló, táblaszintű PRIMARY KEY záradékként írják, nem pedig egyetlen oszlopdefiníción belül.

SQLite Idegen kulcsműveletek: TÖRLÉS és FRISSÍTÉS ESETÉN

Egy idegen kulcs azt is szabályozhatja, hogy mi történjen a gyermeksorokkal, amikor a hivatkozott szülősor törlődik vagy frissül. Ezeket a hivatkozási műveleteket az ON DELETE és ON UPDATE záradékokkal adjuk hozzá az idegen kulcs definiálásakor. SQLite öt tevékenységet támogat:

  • NINCS MŰVELET — az alapértelmezett művelet, amely hibát okoz, ha a gyermek sorok továbbra is a szülőre hivatkoznak.
  • KORLÁTOZ — megakadályozza az azonnali törlést vagy frissítést, mielőtt bármilyen más módosítás végrehajtódna.
  • SET NULL — a gyermek idegen kulcs oszlopát null értékre állítja.
  • ALAPÉRTELMEZETTRE ÁLLÍTÁS — a gyermek idegen kulcs oszlopát a deklarált alapértelmezett értékre állítja.
  • VÍZESÉS — ugyanazt a módosítást alkalmazza a gyermek sorokra, tehát egy szülő törlése a gyermekeit is törli.

Az alábbi példa újraalkotja a Hallgatók táblát, így egy tanszék törlése automatikusan törli a hozzá tartozó hallgatókat is, a tanszékazonosító frissítése pedig frissíti a megfelelő hallgatókat:

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
);

Ne feledd, hogy a referenciális műveletek csak akkor futnak le, ha az idegen kulcsok támogatása be van kapcsolva, ezért minden kapcsolat elején futtasd a PRAGMA foreign_keys = ON parancsot. Enélkül a SQLite elemzi az ON DELETE és ON UPDATE záradékokat, de nem kényszeríti ki azokat.

GYIK

Igen. Amikor egyetlen oszlopot pontosan INTEGER PRIMARY KEY-ként deklarálunk, akkor az a tábla beépített sorazonosítójának aliasává válik. SQLite nem tart fenn külön indexet hozzá, így az adott kulcs szerinti keresések gyorsak és nem igényelnek extra tárhelyet.

Az idegen kulcs kényszerítése alapértelmezés szerint kikapcsolva marad, hogy megőrizze a visszafelé kompatibilitást a régebbi adatbázisokkal és a 3.6.19-es verzió előtt írt szkriptekkel. Minden adatbázis-kapcsolathoz le kell futtatni a PRAGMA foreign_keys = ON beállítást a művelet előtt. SQLite megkezdi az idegen kulcskorlátozások ellenőrzését.

SQLite automatikusan indexeli az elsődleges kulcsokat és az EGYEDI oszlopokat, de az idegen kulcs oszlopait nem. Mivel a gyermek oszlop minden korlátozás-ellenőrzéskor beolvasásra kerül, a teljesítmény érdekében ajánlott minden idegen kulcs oszlophoz saját indexet létrehozni.

Nem. ALTER TABLE itt: SQLite Nem lehet elsődleges kulcsot vagy idegen kulcsot hozzáadni egy meglévő táblához. Nevezd át a régi táblát, hozz létre egy új táblát a definiált kulccsal, másold át a sorokat az INSERT SELECT paranccsal, majd töröld a régi táblát.

Egy egyszerű INTEGER PRIMARY KEY a következő azonosítót a legnagyobb meglévő sorazonosító feletti azonosítóként rendeli hozzá, és a törlések után újra felhasználhatja az azonosítókat. tracA ks az sqlite_sequence-ben valaha használt legmagasabb azonosítót használja, és soha nem használja fel újra az értéket, kis teljesítményköltséggel.

Ez a hiba akkor jelenik meg, ha olyan alárendelt sort szúr be vagy frissít, amelynek idegen kulcsértékéhez nem tartozik egyező sor a szülő táblában, vagy ha olyan szülő sort töröl, amelynek még vannak alárendelt sorai. Először a szülőrekordot illessze be.

Igen. A mesterséges intelligencián alapuló szöveg-SQL asszisztensek a táblázatok egyszerű angol leírását CREATE TABLE utasításokká alakítják PRIMARY KEY és FOREIGN KEY záradékokkal. A meglévő séma megadása javítja a pontosságot, és a generált SQL-t mindig ellenőrizni kell, mielőtt valós adatokon futtatnánk.

Igen. GitHub másodpilóta azt javasolja, hogy a CREATE TABLE kódot PRIMARY KEY-vel, FOREIGN KEY-vel és egyéb korlátozásokkal építsük be a szerkesztőkbe, például VS CodeBeolvassa a meglévő sémát és migrációkat, így a kiegészítései újra felhasználják a valódi tábla- és oszlopneveket.

Foglald össze ezt a bejegyzést a következőképpen: