sql >> Database >  >> RDS >> SQLite

SQLite primaire sleutel

Samenvatting :in deze tutorial leer je hoe je SQLite PRIMARY KEY . gebruikt beperking om een ​​primaire sleutel voor een tabel te definiëren.

Inleiding tot de primaire sleutel van SQLite

Een primaire sleutel is een kolom of groep kolommen die wordt gebruikt om de uniciteit van rijen in een tabel te identificeren. Elke tabel heeft één en slechts één primaire sleutel.

Met SQLite kunt u de primaire sleutel op twee manieren definiëren:

Ten eerste, als de primaire sleutel maar één kolom heeft, gebruik je de PRIMARY KEY kolombeperking om de primaire sleutel als volgt te definiëren:

CREATE TABLE table_name(
   column_1 INTEGER NOT NULL PRIMARY KEY,
   ...
);Code language: PHP (php)

Ten tweede, als de primaire sleutel uit twee of meer kolommen bestaat, gebruik je de PRIMARY KEY tabelbeperking om de primaire te definiëren, zoals weergegeven in de volgende instructie.

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)

In de SQL-standaard mag de kolom met de primaire sleutel geen NULL bevatten waarden. Dit betekent dat de primaire sleutelkolom een ​​impliciete NOT NULL . heeft beperking.

Om de huidige versie van SQLite echter compatibel te maken met de eerdere versie, staat SQLite toe dat de primaire sleutelkolom NULL bevat. waarden.

SQLite primaire sleutel en rowid-tabel

Wanneer u een tabel maakt zonder de WITHOUT ROWID . op te geven optie, voegt SQLite een impliciete kolom toe genaamd rowid dat 64-bits geheel getal met teken opslaat. De rowid kolom is een sleutel die de rijen in de tabel op unieke wijze identificeert. Tabellen die rowid . hebben kolommen heten rowid tabellen.

Als een tabel de primaire sleutel heeft die uit één kolom bestaat, en die kolom is gedefinieerd als INTEGER dan wordt deze primaire sleutelkolom een ​​alias voor de rowid kolom.

Merk op dat als u een ander geheel getaltype toewijst, zoals BIGINT en UNSIGNED INT naar de primaire sleutelkolom, zal deze kolom geen alias zijn voor de rowid kolom.

Omdat de rowid tabel organiseert zijn gegevens als een B-boom, waarbij de gegevens van een rowid worden opgevraagd en gesorteerd tafel zijn erg snel. Het is sneller dan het gebruik van een primaire sleutel die geen alias is van de rowid .

Een andere belangrijke opmerking is dat als u een kolom declareert met de INTEGER type en PRIMARY KEY DESC clausule, wordt deze kolom geen alias voor de rowid kolom:

CREATE TABLE table(
   pk INTEGER PRIMARY KEY DESC,
   ...
);Code language: SQL (Structured Query Language) (sql)

Voorbeelden van SQLite-primaire sleutels maken

De volgende instructie creëert een tabel met de naam countries die country_id . heeft kolom als de primaire sleutel.

CREATE TABLE countries (
   country_id INTEGER PRIMARY KEY,
   name TEXT NOT NULL
);Code language: SQL (Structured Query Language) (sql)

Probeer het

Omdat de primaire sleutel van de countries tabel heeft slechts één kolom, we hebben de primaire sleutel gedefinieerd met behulp van PRIMARY KEY kolombeperking.

Het is mogelijk om de PRIMARY KEY . te gebruiken tabelbeperking om de primaire sleutel te definiëren die uit één kolom bestaat, zoals weergegeven in de volgende instructie:

CREATE TABLE languages (
   language_id INTEGER,
   name TEXT NOT NULL,
   PRIMARY KEY (language_id)
);Code language: SQL (Structured Query Language) (sql)

Probeer het

Voor tabellen waarvan de primaire sleutels uit meer dan één kolom bestaan, moet u echter PRIMARY KEY gebruiken tabelbeperking om primaire sleutels te definiëren.

De volgende instructie creëert de country_languages tabel waarvan de primaire sleutel uit twee kolommen bestaat.

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)

Probeer het

Voorbeeld van SQLite-primaire sleutel toevoegen

In tegenstelling tot andere databasesystemen, zoals MySQL en PostgreSQL, kunt u de ALTER TABLE niet gebruiken statement om een ​​primaire sleutel aan een bestaande tabel toe te voegen.

U moet deze stappen volgen om de beperking te omzeilen:

  1. Schakel eerst de vinkje voor de externe sleutelconstarint uit.
  2. Hernoem vervolgens de tabel naar een andere tabelnaam (old_table)
  3. Maak vervolgens een nieuwe tabel (tabel) met de exacte structuur van de tabel waarvan u de naam hebt gekregen.
  4. Kopieer daarna de gegevens van de old_table naar de tabel.
  5. Schakel ten slotte de beperking van de externe sleutel in

Zie de volgende uitspraken:

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)

Probeer het

De BEGIN TRANSACTION start een nieuwe transactie. Het zorgt ervoor dat alle volgende instructies met succes worden uitgevoerd of dat er helemaal niets wordt uitgevoerd.

De COMMIT statement begaat alle uitspraken.

Laten we een tabelnaam maken cities zonder een primaire sleutel.

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)

Probeer het

Om de primaire sleutel toe te voegen aan de cities tabel, voert u de volgende stappen uit:

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)

Probeer het

Als u de SQLite GUI-tool gebruikt, kunt u de volgende instructie gebruiken om de informatie over de tabel te tonen.

PRAGMA table_info([cities]);Code language: SQL (Structured Query Language) (sql)

Probeer het

In deze tutorial heb je geleerd om de SQLite PRIMARY KEY . te gebruiken beperking om de primaire sleutel voor een tabel te definiëren.


  1. PL/SQL - Lijstvariabele gebruiken in Waar in clausule

  2. Hardware selecteren en configureren voor SQL Server 2016 Standard Edition

  3. Hoe kan ik gegevens in twee tabellen tegelijk INVOEREN in SQL Server?

  4. Hoe een onbekend aantal kolommen te draaien en geen aggregaat in SQL Server?