Primær nøgle og fremmed nøgle ind SQLite med eksempler

⚡ Smart opsummering

Primære nøgler og fremmednøgler i SQLite håndhæve dataintegritet ved entydigt at identificere hver række og linke relaterede tabeller, hvilket sikrer, at refererede værdier altid findes, og forhindrer dubletter, null- eller forældreløse poster på tværs af en relationsdatabase.

  • 🔑 Primærnøgle: En primærnøgle identificerer entydigt hver række, og dens værdier skal være unikke og aldrig være nul.
  • 🧩 Sammensat nøgle: Kombination af to eller flere kolonner danner en sammensat primærnøgle, når ingen enkelt kolonne er unik.
  • 🔗 Fremmed nøgle: En fremmednøgle refererer til en overordnet tabelnøgle og håndhæver referentiel integritet mellem relaterede tabeller.
  • 🇧🇷 Aktivér håndhævelse: SQLite deaktiverer som standard fremmednøgler, så kør PRAGMA foreign_keys = ON for at aktivere dem.
  • 🧱 Kolonnebegrænsninger: Reglerne NOT NULL, DEFAULT, UNIQUE og CHECK validerer værdier, før de indtastes i en kolonne.
  • 🤖 AI Assistance: AI tekst-til-SQL-assistenter og GitHub Copilot genererer nøgle- og begrænsnings-SQL fra almindeligt engelsk.

Primær nøgle og fremmed nøgle ind SQLite

Afsnittene nedenfor forklarer SQLite begrænsninger i detaljer, startende med PRIMARY KEY og FOREIGN KEY, der definerer og forbinder tabeller, og dækker NOT NULL, DEFAULT, UNIQUE og CHECK reglerne, der validerer dataene i hver kolonne.

SQLite Begrænsninger

Kolonnebegrænsninger håndhæver regler for de værdier, der indsættes i en kolonne, for at validere dataene. Disse begrænsninger defineres, når en tabel oprettes, inde i kolonnedefinitionen. De holder de gemte data konsistente og nøjagtige ved at afvise værdier, der bryder de regler, du angiver, f.eks. dubletter, nullværdier eller værdier, der ikke findes i en relateret tabel.

SQLite Primærnøgle

Alle værdier i en primærnøglekolonne skal være unikke og ikke null. Primærnøglen identificerer entydigt hver række i tabellen.

Primærnøglen kan anvendes på kun én kolonne eller på en kombination af kolonner. I sidstnævnte tilfælde skal kombinationen af ​​kolonnernes værdier være unik for alle tabellens rækker.

Syntaks:

Der er flere forskellige måder at definere en primærnøgle i en tabel:

I selve kolonnedefinitionen:

ColumnName INTEGER NOT NULL PRIMARY KEY;

Som en separat definition:

PRIMARY KEY(ColumnName);

Sådan opretter du en kombination af kolonner som en primær nøgle:

PRIMARY KEY(ColumnName1, ColumnName2);

SQLite IKKE NULL, STANDARD, UNIK og CHECK-begrænsninger

Udover den primære nøgle, SQLite indeholder adskillige kolonnebegrænsninger, der validerer de værdier, der indtastes i en tabel. Begrænsningerne NOT NULL, DEFAULT, UNIQUE og CHECK er hver især defineret i kolonnedefinitionen, og hver af dem håndhæver en specifik regel for kolonnens datatype og værdier.

IKKE NULL-begrænsning

SQLite NOT NULL-begrænsningen forhindrer en kolonne i at have en null-værdi:

ColumnName INTEGER  NOT NULL;

STANDARD Begrænsning

Med SQLite STANDARDbegrænsning, hvis du ikke indsætter nogen værdi i en kolonne, indsættes standardværdien i stedet.

For eksempel:

ColumnName INTEGER DEFAULT 0;

Hvis du skriver en insert-sætning og ikke angiver nogen værdi for den kolonne, vil kolonnen have værdien 0.

UNIK Begrænsning

SQLite UNIQUE-begrænsningen forhindrer dubletter blandt alle værdierne i kolonnen.

For eksempel:

EmployeeId INTEGER NOT NULL UNIQUE;

Dette gør det muligt at gøre værdien "EmployeeId" unik; duplikerede værdier er ikke tilladt. Bemærk, at dette kun gælder for værdierne i kolonnen "EmployeeId".

CHECK-begrænsning

SQLite CHECK-betingelsen sætter en betingelse for at kontrollere en indsat værdi. Hvis værdien ikke matcher betingelsen, vil den ikke blive indsat.

Quantity INTEGER NOT NULL CHECK(Quantity > 10);

Du kan ikke indsætte en værdi mindre end 10 i kolonnen "Mængde".

SQLite Fremmed nøgle

SQLite En fremmednøgle er en begrænsning, der verificerer eksistensen af ​​en værdi, der findes i én tabel i en anden tabel, og som har en relation til den første tabel, hvor fremmednøglen er defineret.

Når man arbejder med flere tabeller, er der tilfælde, hvor to tabeller relaterer til hinanden via én fælles kolonne. Hvis du vil sikre, at den værdi, der indsættes i en af ​​dem, skal findes i den anden tabels kolonne, skal du bruge en fremmednøglebegrænsning på den fælles kolonne.

I dette tilfælde, når du forsøger at indsætte en værdi i den kolonne, vil den fremmede nøgle sikre, at den indsatte værdi findes i den refererede tabels kolonne.

Bemærk, at begrænsninger for fremmednøgler ikke er aktiveret som standard i SQLiteDu skal først aktivere dem ved at køre følgende kommando:

PRAGMA foreign_keys = ON;

Udenlandske nøglebegrænsninger blev indført i SQLite fra version 3.6.19.

Eksempel SQLite Fremmed nøgle

Antag, at vi har to tabeller: Studerende og Afdelinger.

Tabellen Studerende indeholder en liste over studerende, og tabellen Afdelinger indeholder en liste over afdelingerne. Hver studerende tilhører en afdeling; det vil sige, at hver studerende har en afdelings-ID-kolonne.

Nu skal vi se, hvordan fremmednøglebegrænsningen kan være nyttig til at sikre, at værdien af ​​afdelings-id'et i tabellen Studenter skal findes i tabellen Afdelinger.

Så hvis vi opretter en fremmednøglebegrænsning på DepartmentId i Students-tabellen, skal hvert indsatte departmentId være til stede i Departments-tabellen.

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

For at undersøge, hvordan fremmednøglebegrænsninger kan forhindre et udefineret element eller en udefineret værdi i at blive indsat i en tabel, der har en relation til en anden tabel, vil vi se på følgende eksempel.

I dette eksempel har tabellen Afdelinger en fremmednøgle-relation til tabellen Studerende, så enhver departmentId-værdi, der indsættes i tabellen Studerende, skal findes i tabellen Afdelinger. Hvis du forsøger at indsætte en departmentId-værdi, der ikke findes i tabellen Afdelinger, vil fremmednøglebegrænsningen forhindre dig i at gøre det.

Lad os indsætte to afdelinger, "IT" og "Kunst", i afdelingstabellen med følgende INSERT-forespørgsler:

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

De to udsagn bør indsætte to afdelinger i tabellen Afdelinger. Du kan bekræfte, at de to værdier blev indsat, ved at køre forespørgslen "SELECT * FROM Afdelinger" bagefter:

SELECT-forespørgselsresultat, der viser IT- og kunstafdelingerne i SQLite

Prøv derefter at indsætte en ny studerende med et afdelings-ID, der ikke findes i afdelingstabellen:

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

Rækken vil ikke blive indsat, og du vil få en fejlmeddelelse, der siger: FOREIGN KEY-begrænsning mislykkedes.

SQLite Fejlmeddelelse om fejl i FOREIGN KEY-begrænsning

Forskellen mellem primærnøgle og fremmednøgle i SQLite

Primære nøgler og fremmednøgler hjælper begge med at opretholde dataintegritet, men de spiller forskellige roller. En primærnøgle identificerer rækker i en enkelt tabel, mens en fremmednøgle forbinder rækker på tværs af to relaterede tabeller. Tabellen nedenfor opsummerer de vigtigste forskelle.

Basis Primærnøgle Fremmed nøgle
Formål Identificerer entydigt hver række i sin egen tabel Henviser til den primære nøgle i en anden tabel for at linke dem sammen
Entydighed Værdier skal være unikke Værdier kan gentages, så mange underordnede rækker kan dele én overordnet række
Nulværdier Kan ikke være null Kan være null, når relationen er valgfri
Antal pr. bord Kun én primærnøgle pr. tabel En tabel kan have flere fremmednøgler
Indeksering Indekseret automatisk Ikke indekseret automatisk; tilføj en for ydeevne

I eksemplet med studerende og afdelinger er DepartmentId den primære nøgle i tabellen Afdelinger og en fremmednøgle i tabellen Studerende, hvilket er det, der forbinder hver studerende med en gyldig afdeling.

SQLite Sammensat primærnøgle

En sammensat primærnøgle er en primærnøgle bestående af to eller flere kolonner. Den bruges, når ingen enkelt kolonne er unik i sig selv, men kombinationen af ​​kolonner er unik for hver række. SQLite behandler de kombinerede værdier som én nøgle.

For eksempel kan en tilmeldingstabel tillade den samme studerende i mange kurser og det samme kursus for mange studerende, men hvert studerende-kursus-par bør kun forekomme én gang:

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

Her er hverken StudentId eller CourseId unikt alene, men parret (StudentId, CourseId) er unikt, så den samme studerende kan ikke være tilmeldt det samme kursus to gange. Bemærk følgende punkter, når du bruger en sammensat nøgle:

  • Brug en sammensat nøgle, når en enkelt kolonne ikke entydigt kan identificere en række.
  • Hver kolonne i den sammensatte nøgle følger reglerne for primære nøgler, så den kombinerede værdi skal være unik og ikke nul.
  • En sammensat nøgle skrives som en separat PRIMARY KEY-klausul på tabelniveau, ikke inde i en enkelt kolonnedefinition.

SQLite Fremmednøglehandlinger: VED SLETNING og VED OPDATERING

En fremmednøgle kan også styre, hvad der sker med underordnede rækker, når den overordnede række, de refererer til, slettes eller opdateres. Disse referentielle handlinger tilføjes med ON DELETE- og ON UPDATE-klausulerne, når du definerer fremmednøglen. SQLite understøtter fem handlinger:

  • INGEN HANDLING — standardhandlingen, som udløser en fejl, hvis underordnede rækker stadig refererer til den overordnede.
  • BEGRÆNSE — forhindrer sletning eller opdatering med det samme, før andre ændringer udføres.
  • SÆT NULL — sætter den underordnede fremmednøglekolonne til null.
  • SÆT STANDARD — indstiller den underordnede fremmednøglekolonne til dens deklarerede standardværdi.
  • CASCADE — anvender den samme ændring på de underordnede rækker, så sletning af en overordnet række sletter også dens underrækker.

Eksemplet nedenfor genskaber tabellen Studerende, så sletning af en afdeling automatisk sletter dens studerende, og opdatering af et afdelings-id opdaterer de matchende studerende:

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

Husk at referentielle handlinger kun kører, når understøttelse af fremmednøgler er aktiveret, så kør PRAGMA foreign_keys = ON i starten af ​​hver forbindelse. Uden den, SQLite analyserer ON DELETE- og ON UPDATE-klausulerne, men håndhæver dem ikke.

Ofte Stillede Spørgsmål

Ja. Når en enkelt kolonne erklæres præcis som INTEGER PRIMARY KEY, bliver den et alias for tabellens indbyggede rowid. SQLite har ikke noget separat indeks for det, så opslag efter den nøgle er hurtige og bruger ingen ekstra lagerplads.

Håndhævelse af fremmednøgler forbliver som standard slået fra for at bevare bagudkompatibilitet med ældre databaser og scripts skrevet før version 3.6.19. Hver databaseforbindelse skal køre PRAGMA foreign_keys = ON før SQLite begynder at kontrollere fremmednøglebegrænsninger.

SQLite Indekserer automatisk primære nøgler og UNIQUE kolonner, men indekserer ikke fremmednøglekolonner. Da underkolonnen læses ved hver begrænsningskontrol, anbefales det at oprette dit eget indeks på hver fremmednøglekolonne af hensyn til ydeevnen.

Nr. ÆNDRE TABEL i SQLite kan ikke tilføje en primærnøgle eller fremmednøgle til en eksisterende tabel. Du omdøber den gamle tabel, opretter en ny tabel med den definerede nøgle, kopierer rækkerne over med INSERT SELECT og sletter derefter den gamle tabel.

En almindelig INTEGER PRIMÆR NØGLE tildeler det næste id som et over det største eksisterende række-id og kan genbruge id'er efter sletninger. tracks det højeste id nogensinde brugt i sqlite_sequence og genbruger aldrig en værdi, til en lille ydeevneomkostning.

Denne fejl vises, når du indsætter eller opdaterer en underordnet række, hvis fremmednøgleværdi ikke har nogen matchende række i den overordnede tabel, eller når du sletter en overordnet række, der stadig har underordnede rækker. Indsæt den overordnede post først.

Ja. AI tekst-til-SQL-assistenter konverterer en almindelig engelsk beskrivelse af dine tabeller til CREATE TABLE-sætninger med PRIMARY KEY- og FOREIGN KEY-klausuler. Angivelse af det eksisterende skema forbedrer nøjagtigheden, og genereret SQL bør altid gennemgås, før den køres på rigtige data.

Ja. GitHub Copilot foreslår CREATE TABLE-kode med PRIMARY KEY, FOREIGN KEY og andre begrænsninger indlejret i editorer som f.eks. VS CodeDen læser dit eksisterende skema og dine migreringer, så dens fuldførelser genbruger dine rigtige tabel- og kolonnenavne.

Opsummer dette indlæg med: