Primaire sleutel en buitenlandse sleutel invoeren SQLite met voorbeelden

โšก Slimme samenvatting

Primaire sleutels en externe sleutels in SQLite Zorg voor data-integriteit door elke rij uniek te identificeren en gerelateerde tabellen aan elkaar te koppelen, zodat de waarden waarnaar wordt verwezen altijd bestaan โ€‹โ€‹en dubbele, null- of weesrecords in een relationele database worden voorkomen.

  • ๐Ÿ”‘ Hoofdsleutel: Een primaire sleutel identificeert elke rij uniek, en de waarden ervan moeten uniek zijn en mogen nooit null zijn.
  • ๐Ÿงฉ Samengestelde sleutel: Door twee of meer kolommen te combineren, ontstaat een samengestelde primaire sleutel wanneer geen enkele kolom uniek is.
  • ๐Ÿ”— Vreemde sleutel: Een externe sleutel verwijst naar een sleutel van een bovenliggende tabel en zorgt voor referentiรซle integriteit tussen gerelateerde tabellen.
  • โš™๏ธ Handhaving inschakelen: SQLite Schakelt standaard foreign keys uit, dus voer PRAGMA foreign_keys = ON uit om ze te activeren.
  • ๐Ÿงฑ Kolombeperkingen: De regels NOT NULL, DEFAULT, UNIQUE en CHECK valideren waarden voordat ze in een kolom worden opgenomen.
  • ๐Ÿค– AI-assistentie: AI-assistenten voor het omzetten van tekst naar SQL en GitHub Copilot genereren sleutel- en beperkings-SQL vanuit gewone Engelse tekst.

Primaire sleutel en buitenlandse sleutel invoeren SQLite

De onderstaande secties leggen uit SQLite De beperkingen worden in detail besproken, te beginnen met de PRIMARY KEY en FOREIGN KEY die tabellen definiรซren en verbinden, en vervolgens de NOT NULL-, DEFAULT-, UNIQUE- en CHECK-regels die de gegevens in elke kolom valideren.

SQLite beperkingen

Kolombeperkingen leggen regels op aan de waarden die in een kolom worden ingevoerd om de gegevens te valideren. Deze beperkingen worden gedefinieerd bij het aanmaken van een tabel, binnen de kolomdefinitie. Ze zorgen ervoor dat de opgeslagen gegevens consistent en nauwkeurig blijven door waarden te weigeren die de ingestelde regels overtreden, zoals duplicaten, null-waarden of waarden die niet in een gerelateerde tabel voorkomen.

SQLite Hoofdsleutel

Alle waarden in een primaire sleutelkolom moeten uniek zijn en mogen niet null zijn. De primaire sleutel identificeert elke rij in de tabel op unieke wijze.

De primaire sleutel kan worden toegepast op slechts รฉรฉn kolom of op een combinatie van kolommen. In het laatste geval moet de combinatie van de kolomwaarden uniek zijn voor alle rijen van de tabel.

Syntax:

Er zijn verschillende manieren om een โ€‹โ€‹primaire sleutel in een tabel te definiรซren:

In de kolomdefinitie zelf:

ColumnName INTEGER NOT NULL PRIMARY KEY;

Als aparte definitie:

PRIMARY KEY(ColumnName);

Om een โ€‹โ€‹combinatie van kolommen als primaire sleutel te maken:

PRIMARY KEY(ColumnName1, ColumnName2);

SQLite NOT NULL-, DEFAULT-, UNIQUE- en CHECK-beperkingen

Naast de primaire sleutel, SQLite Biedt verschillende kolombeperkingen die de in een tabel ingevoerde waarden valideren. De beperkingen NOT NULL, DEFAULT, UNIQUE en CHECK worden elk gedefinieerd in de kolomdefinitie en elk ervan legt een specifieke regel op aan de kolom. data type en waarden.

NIET NULL-beperking

De SQLite De NOT NULL-beperking voorkomt dat een kolom een โ€‹โ€‹null-waarde kan bevatten:

ColumnName INTEGER  NOT NULL;

STANDAARD Beperking

Met de SQLite De DEFAULT-beperking zorgt ervoor dat als u geen waarde in een kolom invoert, de standaardwaarde wordt ingevoegd.

Bijvoorbeeld:

ColumnName INTEGER DEFAULT 0;

Als je een INSERT-instructie schrijft en geen waarde voor die kolom opgeeft, krijgt de kolom de waarde 0.

UNIEKE beperking

De SQLite De UNIQUE-beperking voorkomt dat er dubbele waarden voorkomen in de kolom.

Bijvoorbeeld:

EmployeeId INTEGER NOT NULL UNIQUE;

Dit zorgt ervoor dat de waarde van "EmployeeId" uniek is; dubbele waarden zijn niet toegestaan. Houd er rekening mee dat dit alleen van toepassing is op de waarden in de kolom "EmployeeId".

CONTROLEER Beperking

De SQLite De CHECK-beperking stelt een voorwaarde in om een โ€‹โ€‹in te voeren waarde te controleren. Als de waarde niet aan de voorwaarde voldoet, wordt deze niet ingevoegd.

Quantity INTEGER NOT NULL CHECK(Quantity > 10);

Je kunt in de kolom 'Hoeveelheid' geen waarde kleiner dan 10 invoeren.

SQLite Vreemde sleutel

De SQLite Een foreign key is een beperking die controleert of een waarde die in de ene tabel voorkomt, ook bestaat in een andere tabel die een relatie heeft met de eerste tabel waarin de foreign key is gedefinieerd.

Bij het werken met meerdere tabellen zijn er gevallen waarin twee tabellen via รฉรฉn gemeenschappelijke kolom aan elkaar zijn gekoppeld. Als u wilt garanderen dat de waarde die in de ene tabel wordt ingevoerd ook in de kolom van de andere tabel voorkomt, dan moet u een foreign key-beperking op die gemeenschappelijke kolom toepassen.

In dit geval zorgt de externe sleutel ervoor dat, wanneer u een waarde in die kolom probeert in te voegen, de ingevoegde waarde ook daadwerkelijk in de kolom van de betreffende tabel bestaat.

Houd er rekening mee dat beperkingen met betrekking tot externe sleutels niet standaard zijn ingeschakeld in SQLiteJe moet ze eerst inschakelen door de volgende opdracht uit te voeren:

PRAGMA foreign_keys = ON;

Er zijn externe sleutelbeperkingen geรฏntroduceerd SQLite vanaf versie 3.6.19.

Voorbeeld SQLite Vreemde sleutel

Stel dat we twee tabellen hebben: Studenten en Afdelingen.

De tabel 'Studenten' bevat een lijst met studenten en de tabel 'Afdelingen' bevat een lijst met afdelingen. Elke student behoort tot een afdeling; dat wil zeggen dat elke student een kolom 'afdelings-ID' heeft.

Nu zullen we zien hoe de foreign key-beperking kan helpen om ervoor te zorgen dat de waarde van de afdelings-ID in de tabel Studenten ook in de tabel Afdelingen voorkomt.

Als we dus een foreign key-beperking op de DepartmentId in de Students-tabel instellen, moet elke ingevoegde departmentId ook in de Departments-tabel aanwezig zijn.

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

Om te controleren hoe foreign key-beperkingen kunnen voorkomen dat een ongedefinieerd element of een ongedefinieerde waarde wordt ingevoegd in een tabel die een relatie heeft met een andere tabel, zullen we het volgende voorbeeld bekijken.

In dit voorbeeld heeft de tabel 'Afdelingen' een externe sleutelrelatie met de tabel 'Studenten'. Dit betekent dat elke waarde voor 'afdelings-ID' die in de tabel 'Studenten' wordt ingevoerd, ook in de tabel 'Afdelingen' moet voorkomen. Als u probeert een waarde voor 'afdelings-ID' in te voeren die niet in de tabel 'Afdelingen' voorkomt, zal de externe sleutelbeperking dit verhinderen.

Laten we twee afdelingen, "IT" en "Kunst", toevoegen aan de tabel Afdelingen met de volgende gegevens: INSERT-query's:

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

De twee instructies zouden twee afdelingen in de tabel Afdelingen moeten invoegen. U kunt controleren of de twee waarden zijn ingevoegd door daarna de query "SELECT * FROM Afdelingen" uit te voeren:

SELECT-queryresultaat dat de IT- en Kunstafdelingen weergeeft in SQLite

Probeer vervolgens een nieuwe student in te voegen met een departmentId die niet in de tabel Departments voorkomt:

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

De rij wordt niet ingevoegd en u krijgt een foutmelding met de tekst: FOREIGN KEY-beperking mislukt.

SQLite Foutmelding: FOREIGN KEY-beperking mislukt

Verschil tussen primaire sleutel en externe sleutel in SQLite

Primaire sleutels en externe sleutels dragen beide bij aan de integriteit van gegevens, maar ze spelen verschillende rollen. Een primaire sleutel identificeert rijen binnen รฉรฉn tabel, terwijl een externe sleutel rijen in twee gerelateerde tabellen met elkaar verbindt. De onderstaande tabel vat de belangrijkste verschillen samen.

Basis Hoofdsleutel Vreemde sleutel
Doel Identificeert elke rij in zijn eigen tabel op unieke wijze. Verwijst naar de primaire sleutel van een andere tabel om ze aan elkaar te koppelen.
Uniciteit Waarden moeten uniek zijn. Waarden kunnen zich herhalen, waardoor meerdere onderliggende rijen รฉรฉn ouder kunnen delen.
Null-waarden Kan niet null zijn Kan null zijn wanneer de relatie optioneel is.
Aantal per tafel Slechts รฉรฉn primaire sleutel per tabel Een tabel kan meerdere externe sleutels bevatten.
Indexeren Automatisch geรฏndexeerd Wordt niet automatisch geรฏndexeerd; voeg er รฉรฉn toe voor betere prestaties.

In het voorbeeld met studenten en afdelingen is DepartmentId de primaire sleutel van de tabel Afdelingen en een externe sleutel in de tabel Studenten, waarmee elke student aan een geldige afdeling wordt gekoppeld.

SQLite Samengestelde primaire sleutel

Een samengestelde primaire sleutel is een primaire sleutel die bestaat uit twee of meer kolommen. Deze wordt gebruikt wanneer geen enkele kolom op zichzelf uniek is, maar de combinatie van kolommen wel uniek is voor elke rij. SQLite behandelt de gecombineerde waarden als รฉรฉn sleutel.

Een inschrijvingstabel kan bijvoorbeeld toestaan โ€‹โ€‹dat dezelfde student zich voor meerdere cursussen inschrijft en dat meerdere studenten dezelfde cursus volgen, maar elk student-cursuspaar mag slechts รฉรฉn keer voorkomen:

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

Hier is noch StudentId noch CourseId op zichzelf uniek, maar het paar (StudentId, CourseId) is wel uniek, waardoor dezelfde student niet twee keer voor dezelfde cursus kan worden ingeschreven. Houd rekening met de volgende punten wanneer u een samengestelde sleutel gebruikt:

  • Gebruik een samengestelde sleutel wanneer een enkele kolom een โ€‹โ€‹rij niet uniek kan identificeren.
  • Elke kolom in de samengestelde sleutel voldoet aan de regels van de primaire sleutel, dus de gecombineerde waarde moet uniek zijn en mag niet null zijn.
  • Een samengestelde sleutel wordt geschreven als een aparte PRIMARY KEY-clausule op tabelniveau, niet binnen รฉรฉn enkele kolomdefinitie.

SQLite Acties van externe sleutels: ON DELETE en ON UPDATE

Een externe sleutel kan ook bepalen wat er met onderliggende rijen gebeurt wanneer de bovenliggende rij waarnaar ze verwijzen, wordt verwijderd of bijgewerkt. Deze referentiรซle acties worden toegevoegd met de clausules ON DELETE en ON UPDATE wanneer u de externe sleutel definieert. SQLite ondersteunt vijf acties:

  • GEEN ACTIE โ€” de standaardactie, die een foutmelding geeft als onderliggende rijen nog steeds naar de bovenliggende rij verwijzen.
  • BEPERKEN โ€” voorkomt dat de verwijdering of update direct plaatsvindt, voordat andere wijzigingen worden uitgevoerd.
  • NUL INSTELLEN โ€” stelt de onderliggende foreign key-kolom in op null.
  • STANDAARD INSTELLEN โ€” stelt de onderliggende foreign key-kolom in op de gedeclareerde standaardwaarde.
  • CASCADE โ€” Deze wijziging wordt ook toegepast op de onderliggende rijen, dus het verwijderen van een ouderrij verwijdert ook de onderliggende rijen.

Het onderstaande voorbeeld maakt de tabel 'Studenten' opnieuw aan, zodat het verwijderen van een afdeling automatisch de bijbehorende studenten verwijdert en het bijwerken van een afdelings-ID de corresponderende studenten bijwerkt:

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

Houd er rekening mee dat referentiรซle acties alleen worden uitgevoerd wanneer ondersteuning voor foreign keys is ingeschakeld. Voer daarom PRAGMA foreign_keys = ON uit aan het begin van elke verbinding. Zonder deze instelling werkt het niet. SQLite Het programma analyseert de ON DELETE- en ON UPDATE-clausules, maar voert ze niet uit.

Veelgestelde vragen

Ja. Wanneer een enkele kolom exact als INTEGER PRIMARY KEY wordt gedeclareerd, wordt deze een alias voor de ingebouwde rowid van de tabel. SQLite Er wordt geen aparte index voor bijgehouden, waardoor zoekopdrachten op basis van die sleutel snel verlopen en geen extra opslagruimte in beslag nemen.

De handhaving van foreign keys is standaard uitgeschakeld om achterwaartse compatibiliteit met oudere databases en scripts van vรณรณr versie 3.6.19 te behouden. Elke databaseverbinding moet PRAGMA foreign_keys = ON uitvoeren voordat dit gebeurt. SQLite begint met het controleren van de foreign key-beperkingen.

SQLite Het indexeert automatisch primaire sleutels en UNIQUE-kolommen, maar geen vreemde sleutels. Omdat de onderliggende kolom bij elke controle van de beperkingen wordt gelezen, is het voor betere prestaties aan te raden om voor elke vreemde sleutelkolom een โ€‹โ€‹eigen index aan te maken.

Nee. ALTER TABLE in SQLite Je kunt geen primaire sleutel of externe sleutel toevoegen aan een bestaande tabel. Je hernoemt de oude tabel, maakt een nieuwe tabel aan met de sleutel gedefinieerd, kopieert de rijen met INSERT SELECT en verwijdert vervolgens de oude tabel.

Een gewone INTEGER PRIMARY KEY wijst de volgende ID toe als een waarde die รฉรฉn hoger is dan de grootste bestaande rij-ID en kan ID's hergebruiken na verwijderingen. AUTOINCREMENT tracks is de hoogste id die ooit in sqlite_sequence is gebruikt en hergebruikt nooit een waarde, wat een kleine prestatievermindering met zich meebrengt.

Deze foutmelding verschijnt wanneer u een onderliggende rij invoegt of bijwerkt waarvan de waarde van de externe sleutel geen overeenkomende rij in de bovenliggende tabel heeft, of wanneer u een bovenliggende rij verwijdert die nog onderliggende rijen heeft. Voeg eerst de bovenliggende record in.

Ja. AI-assistenten voor het omzetten van tekst naar SQL converteren een beschrijving van uw tabellen in begrijpelijke taal naar CREATE TABLE-instructies met PRIMARY KEY- en FOREIGN KEY-clausules. Het opgeven van het bestaande schema verbetert de nauwkeurigheid, en de gegenereerde SQL moet altijd worden gecontroleerd voordat deze op echte gegevens wordt uitgevoerd.

Ja. GitHub-copiloot suggereert CREATE TABLE-code met PRIMARY KEY, FOREIGN KEY en andere beperkingen direct in editors zoals VS CodeHet leest je bestaande schema en migraties, zodat de suggesties voor aanvulling je echte tabel- en kolomnamen hergebruiken.

Vat dit bericht samen met: