Sammanfattning :i den här handledningen kommer du att lära dig hur du använder SQLite PRIMARY KEY
begränsning för att definiera en primärnyckel för en tabell.
Introduktion till primärnyckeln SQLite
En primärnyckel är en kolumn eller grupp av kolumner som används för att identifiera unikheten hos rader i en tabell. Varje tabell har en och endast en primärnyckel.
SQLite låter dig definiera primärnyckeln på två sätt:
Först, om primärnyckeln bara har en kolumn, använder du PRIMARY KEY
kolumnbegränsning för att definiera primärnyckeln enligt följande:
CREATE TABLE table_name(
column_1 INTEGER NOT NULL PRIMARY KEY,
...
);
Code language: PHP (php)
För det andra, om primärnyckeln består av två eller flera kolumner, använder du PRIMARY KEY
tabellbegränsning för att definiera den primära som visas i följande sats.
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 får primärnyckelkolumnen inte innehålla NULL
värden. Det betyder att primärnyckelkolumnen har en implicit NOT NULL
begränsning.
Men för att göra den nuvarande versionen av SQLite kompatibel med den tidigare versionen tillåter SQLite att primärnyckelkolumnen innehåller NULL
värden.
SQLite-primärnyckel och rowid-tabell
När du skapar en tabell utan att ange WITHOUT ROWID
Alternativet lägger SQLite till en implicit kolumn som heter rowid
som lagrar 64-bitars signerade heltal. rowid
kolumn är en nyckel som unikt identifierar raderna i tabellen. Tabeller som har rowid
kolumner kallas rowid
tabeller.
Om en tabell har den primära nyckeln som består av en kolumn, och den kolumnen är definierad som INTEGER
då blir denna primärnyckelkolumn ett alias för rowid
kolumn.
Lägg märke till att om du tilldelar en annan heltalstyp såsom BIGINT
och UNSIGNED INT
till primärnyckelkolumnen kommer denna kolumn inte att vara ett alias för rowid
kolumn.
Eftersom rowid
Tabellen organiserar sina data som ett B-träd, efterfrågar och sorterar data för en rowid
bord är mycket snabba. Det är snabbare än att använda en primärnyckel som inte är ett alias för rowid
.
En annan viktig anmärkning är att om du deklarerar en kolumn med INTEGER
typ och PRIMARY KEY DESC
sats, kommer denna kolumn inte att bli ett alias för rowid
kolumn:
CREATE TABLE table(
pk INTEGER PRIMARY KEY DESC,
...
);
Code language: SQL (Structured Query Language) (sql)
Skapa exempel på SQLite-primärnyckel
Följande sats skapar en tabell med namnet countries
som har country_id
kolumn som primärnyckel.
CREATE TABLE countries (
country_id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Prova det
Eftersom den primära nyckeln för countries
Tabellen har bara en kolumn, vi definierade primärnyckeln med PRIMARY KEY
kolumnbegränsning.
Det är möjligt att använda PRIMARY KEY
tabellrestriktion för att definiera primärnyckeln som består av en kolumn som visas i följande sats:
CREATE TABLE languages (
language_id INTEGER,
name TEXT NOT NULL,
PRIMARY KEY (language_id)
);
Code language: SQL (Structured Query Language) (sql)
Prova det
Men för tabeller där primärnycklarna består av mer än en kolumn måste du använda PRIMARY KEY
tabellbegränsning för att definiera primärnycklar.
Följande sats skapar country_languages
tabell vars primärnyckel består av två kolumner.
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)
Prova det
Exempel på att lägga till SQLite-primärnyckel
Till skillnad från andra databassystem, t.ex. MySQL och PostgreSQL, kan du inte använda ALTER TABLE
för att lägga till en primärnyckel till en befintlig tabell.
Du måste följa dessa steg för att komma runt begränsningen:
- Ställ först av den främmande nyckelkonstarint.
- Döp sedan om tabellen till ett annat tabellnamn (old_table)
- Skapa sedan en ny tabell (tabell) med exakt struktur för tabellen som du har bytt namn på.
- Kopiera sedan data från den gamla_tabellen till tabellen.
- Slutligen aktiverar du kontroll av främmande nycklar
Se följande uttalanden:
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)
Prova det
BEGIN TRANSACTION
startar en ny transaktion. Det säkerställer att alla efterföljande satser körs framgångsrikt eller att ingenting körs alls.
COMMIT
statement begår alla uttalanden.
Låt oss skapa ett tabellnamn cities
utan en primärnyckel.
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)
Prova det
För att lägga till primärnyckeln till cities
tabell, utför du följande steg:
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)
Prova det
Om du använder SQLite GUI-verktyget kan du använda följande sats för att visa tabellens information.
PRAGMA table_info([cities]);
Code language: SQL (Structured Query Language) (sql)
Prova det
I den här handledningen har du lärt dig att använda SQLite PRIMARY KEY
begränsning för att definiera primärnyckeln för en tabell.