sql >> Database teknologi >  >> RDS >> SQLite

SQLite primær nøgle

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:

  1. Først skal du deaktivere den fremmede nøglekonstarint.
  2. Dernæst skal du omdøbe tabellen til et andet tabelnavn (gammel_tabel)
  3. Opret derefter en ny tabel (tabel) med den nøjagtige struktur af den tabel, som du er blevet omdøbt til.
  4. Derefter kopierer du data fra den gamle_tabel til tabellen.
  5. 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.


  1. PDO fetchAll grupperer nøgleværdi-par i assoc-array

  2. Sådan fungerer ELT() i MariaDB

  3. Er det virkelig nødvendigt at oprette SQLite-tabeller, hver gang applikationen starter?

  4. ORA-24247:netværksadgang nægtet af adgangskontrolliste (ACL)