Oversigt :i denne øvelse lærer du, hvordan du bruger SQLite PRIMARY KEY
begrænsning for at definere en primær nøgle til en tabel.
Introduktion til SQLite-primærnøgle
En primærnøgle er en kolonne eller gruppe af kolonner, der bruges til at identificere det unikke af rækker i en tabel. Hver tabel har én og kun én primær nøgle.
SQLite giver dig mulighed for at definere primærnøgle på to måder:
For det første, hvis den primære nøgle kun har én kolonne, bruger du PRIMARY KEY
kolonnebegrænsning for at definere den primære nøgle som følger:
CREATE TABLE table_name(
column_1 INTEGER NOT NULL PRIMARY KEY,
...
);
Code language: PHP (php)
For det andet, hvis den primære nøgle består af to eller flere kolonner, bruger du PRIMARY KEY
tabel begrænsning for at definere den primære som vist i følgende sætning.
CREATE TABLE table_name(
column_1 INTEGER NOT NULL,
column_2 INTEGER NOT NULL,
...
PRIMARY KEY(column_1,column_2,...)
);
Code language: SQL (Structured Query Language) (sql)
I SQL-standarden må den primære nøglekolonne ikke indeholde NULL
værdier. Det betyder, at den primære nøglekolonne har en implicit NOT NULL
begrænsning.
Men for at gøre den nuværende version af SQLite kompatibel med den tidligere version, tillader SQLite, at primærnøglekolonnen indeholder NULL
værdier.
SQLite primær nøgle og rowid tabel
Når du opretter en tabel uden at angive WITHOUT ROWID
option, tilføjer SQLite en implicit kolonne kaldet rowid
der gemmer 64-bit signeret heltal. rowid
kolonne er en nøgle, der entydigt identificerer rækkerne i tabellen. Tabeller, der har rowid
kolonner kaldes rowid
tabeller.
Hvis en tabel har den primære nøgle, der består af én kolonne, og den kolonne er defineret som INTEGER
så bliver denne primærnøglekolonne et alias for rowid
kolonne.
Bemærk, at hvis du tildeler en anden heltalstype såsom BIGINT
og UNSIGNED INT
til den primære nøglekolonne vil denne kolonne ikke være et alias for rowid
kolonne.
Fordi rowid
tabel organiserer sine data som et B-træ, forespørger og sorterer data for en rowid
bordet er meget hurtige. Det er hurtigere end at bruge en primær nøgle, som ikke er et alias for rowid
.
En anden vigtig note er, at hvis du erklærer en kolonne med INTEGER
type og PRIMARY KEY DESC
klausul, bliver denne kolonne ikke et alias for rowid
kolonne:
CREATE TABLE table(
pk INTEGER PRIMARY KEY DESC,
...
);
Code language: SQL (Structured Query Language) (sql)
Oprettelse af SQLite-eksempler på primærnøgle
Følgende sætning opretter en tabel med navnet countries
som har country_id
kolonne som den primære nøgle.
CREATE TABLE countries (
country_id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Prøv det
Fordi den primære nøgle for countries
tabellen har kun én kolonne, vi definerede den primære nøgle ved hjælp af PRIMARY KEY
kolonne begrænsning.
Det er muligt at bruge PRIMARY KEY
tabel begrænsning for at definere den primære nøgle, der består af én kolonne som vist i følgende sætning:
CREATE TABLE languages (
language_id INTEGER,
name TEXT NOT NULL,
PRIMARY KEY (language_id)
);
Code language: SQL (Structured Query Language) (sql)
Prøv det
Men for tabeller, hvor de primære nøgler består af mere end én kolonne, skal du bruge PRIMARY KEY
tabelbegrænsning for at definere primærnøgler.
Følgende sætning opretter country_languages
tabel, hvis primære nøgle består af to kolonner.
CREATE TABLE country_languages (
country_id INTEGER NOT NULL,
language_id INTEGER NOT NULL,
PRIMARY KEY (country_id, language_id),
FOREIGN KEY (country_id) REFERENCES countries (country_id)
ON DELETE CASCADE ON UPDATE NO ACTION,
FOREIGN KEY (language_id) REFERENCES languages (language_id)
ON DELETE CASCADE ON UPDATE NO ACTION
);
Code language: PHP (php)
Prøv det
Eksempel på tilføjelse af SQLite-primærnøgle
I modsætning til andre databasesystemer, f.eks. MySQL og PostgreSQL, kan du ikke bruge ALTER TABLE
sætning for at tilføje en primær nøgle til en eksisterende tabel.
Du skal følge disse trin for at omgå begrænsningen:
- Først skal du deaktivere den fremmede nøglekonstarint.
- Dernæst skal du omdøbe tabellen til et andet tabelnavn (gammel_tabel)
- Opret derefter en ny tabel (tabel) med den nøjagtige struktur af den tabel, som du er blevet omdøbt til.
- Derefter kopierer du data fra den gamle_tabel til tabellen.
- Til sidst skal du aktivere tjek af fremmednøglebegrænsning
Se følgende udsagn:
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE table RENAME TO old_table;
-- define the primary key constraint here
CREATE TABLE table ( ... );
INSERT INTO table SELECT * FROM old_table;
COMMIT;
PRAGMA foreign_keys=on;
Code language: SQL (Structured Query Language) (sql)
Prøv det
BEGIN TRANSACTION
starter en ny transaktion. Det sikrer, at alle efterfølgende sætninger udføres med succes, eller at intet udføres overhovedet.
COMMIT
statement begår alle udsagn.
Lad os oprette et tabelnavn cities
uden en primær nøgle.
CREATE TABLE cities (
id INTEGER NOT NULL,
name text NOT NULL
);
INSERT INTO cities (id, name)
VALUES(1, 'San Jose');
Code language: SQL (Structured Query Language) (sql)
Prøv det
For at tilføje den primære nøgle til cities
tabel, udfører du følgende trin:
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE cities RENAME TO old_cities;
CREATE TABLE cities (
id INTEGER NOT NULL PRIMARY KEY,
name TEXT NOT NULL
);
INSERT INTO cities
SELECT * FROM old_cities;
DROP TABLE old_cities;
COMMIT;
PRAGMA foreign_keys=on;
Code language: SQL (Structured Query Language) (sql)
Prøv det
Hvis du bruger SQLite GUI-værktøj, kan du bruge følgende sætning til at vise tabellens oplysninger.
PRAGMA table_info([cities]);
Code language: SQL (Structured Query Language) (sql)
Prøv det
I denne øvelse har du lært at bruge SQLite PRIMARY KEY
begrænsning for at definere den primære nøgle for en tabel.