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.

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:
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.
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.


