sql >> Databasteknik >  >> RDS >> SQLite

SQLite primär nyckel

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:

  1. Ställ först av den främmande nyckelkonstarint.
  2. Döp sedan om tabellen till ett annat tabellnamn (old_table)
  3. Skapa sedan en ny tabell (tabell) med exakt struktur för tabellen som du har bytt namn på.
  4. Kopiera sedan data från den gamla_tabellen till tabellen.
  5. 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.


  1. SQL Server saknas index

  2. Metadata om PL/SQL-posttyper på paketnivå

  3. Skapa tabell (struktur) från befintlig tabell

  4. Cloud Native och DevSecOps i skala med Capgemini Agile Innovation Platform och Oracle Cloud