SQLite
 sql >> Datenbank >  >> RDS >> SQLite

SQLite-Primärschlüssel

Zusammenfassung :In diesem Tutorial lernen Sie, wie Sie PRIMARY KEY von SQLite verwenden Einschränkung, um einen Primärschlüssel für eine Tabelle zu definieren.

Einführung in den SQLite-Primärschlüssel

Ein Primärschlüssel ist eine Spalte oder eine Gruppe von Spalten, die verwendet wird, um die Eindeutigkeit von Zeilen in einer Tabelle zu identifizieren. Jede Tabelle hat genau einen Primärschlüssel.

Mit SQLite können Sie den Primärschlüssel auf zwei Arten definieren:

Erstens, wenn der Primärschlüssel nur eine Spalte hat, verwenden Sie den PRIMARY KEY Spaltenbeschränkung, um den Primärschlüssel wie folgt zu definieren:

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

Zweitens, falls der Primärschlüssel aus zwei oder mehr Spalten besteht, verwenden Sie den PRIMARY KEY Tabelleneinschränkung, um die primäre wie in der folgenden Anweisung gezeigt zu definieren.

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)

Im SQL-Standard darf die Primärschlüsselspalte NULL nicht enthalten Werte. Das bedeutet, dass die Primärschlüsselspalte einen impliziten NOT NULL hat Einschränkung.

Um jedoch die aktuelle Version von SQLite mit der früheren Version kompatibel zu machen, lässt SQLite zu, dass die Primärschlüsselspalte NULL enthält Werte.

SQLite-Primärschlüssel und Zeilen-ID-Tabelle

Wenn Sie eine Tabelle erstellen, ohne WITHOUT ROWID anzugeben Option fügt SQLite eine implizite Spalte namens rowid hinzu die 64-Bit-Ganzzahl mit Vorzeichen speichert. Die rowid Spalte ist ein Schlüssel, der die Zeilen in der Tabelle eindeutig identifiziert. Tabellen mit rowid Spalten heißen rowid Tabellen.

Wenn eine Tabelle einen Primärschlüssel hat, der aus einer Spalte besteht, und diese Spalte als INTEGER definiert ist dann wird diese Primärschlüsselspalte zu einem Alias für die rowid Spalte.

Beachten Sie das, wenn Sie einen anderen ganzzahligen Typ wie BIGINT zuweisen und UNSIGNED INT zur Primärschlüsselspalte, diese Spalte wird kein Alias ​​für die rowid sein Spalte.

Da die rowid Die Tabelle organisiert ihre Daten als B-Baum und fragt und sortiert Daten einer rowid Tisch sind sehr schnell. Es ist schneller als die Verwendung eines Primärschlüssels, der kein Alias ​​der rowid ist .

Ein weiterer wichtiger Hinweis ist, dass wenn Sie eine Spalte mit dem INTEGER deklarieren Typ und PRIMARY KEY DESC -Klausel wird diese Spalte kein Alias ​​für die rowid Spalte:

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

Beispiele für SQLite-Primärschlüssel erstellen

Die folgende Anweisung erstellt eine Tabelle mit dem Namen countries die country_id hat Spalte als Primärschlüssel.

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

Probieren Sie es aus

Denn der Primärschlüssel der countries Tabelle nur eine Spalte hat, haben wir den Primärschlüssel mit PRIMARY KEY definiert Spaltenbeschränkung.

Es ist möglich, den PRIMARY KEY zu verwenden Tabelleneinschränkung, um den Primärschlüssel zu definieren, der aus einer Spalte besteht, wie in der folgenden Anweisung gezeigt:

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

Probieren Sie es aus

Für Tabellen, deren Primärschlüssel aus mehr als einer Spalte bestehen, müssen Sie jedoch PRIMARY KEY verwenden Tabelleneinschränkung zum Definieren von Primärschlüsseln.

Die folgende Anweisung erstellt die country_languages Tabelle, deren Primärschlüssel aus zwei Spalten besteht.

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)

Probieren Sie es aus

Beispiel für das Hinzufügen eines SQLite-Primärschlüssels

Im Gegensatz zu anderen Datenbanksystemen, z. B. MySQL und PostgreSQL, können Sie ALTER TABLE nicht verwenden -Anweisung zum Hinzufügen eines Primärschlüssels zu einer vorhandenen Tabelle.

Sie müssen die folgenden Schritte ausführen, um die Einschränkung zu umgehen:

  1. Deaktivieren Sie zuerst die Fremdschlüssel-Constarint-Prüfung.
  2. Als nächstes benennen Sie die Tabelle in einen anderen Tabellennamen um (old_table)
  3. Erstellen Sie dann eine neue Tabelle (Tabelle) mit exakter Struktur der Tabelle, die Sie umbenannt haben.
  4. Kopieren Sie danach Daten aus der old_table in die Tabelle.
  5. Schalten Sie zum Schluss die Fremdschlüssel-Einschränkungsprüfung ein

Siehe die folgenden Anweisungen:

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)

Probieren Sie es aus

Die BEGIN TRANSACTION startet eine neue Transaktion. Es stellt sicher, dass alle nachfolgenden Anweisungen erfolgreich oder gar nichts ausgeführt wird.

Das COMMIT -Anweisung schreibt alle Anweisungen fest.

Lassen Sie uns einen Tabellennamen cities erstellen ohne Primärschlüssel.

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)

Probieren Sie es aus

Um den Primärschlüssel zu den cities hinzuzufügen Tabelle führen Sie die folgenden Schritte aus:

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)

Probieren Sie es aus

Wenn Sie das SQLite-GUI-Tool verwenden, können Sie die folgende Anweisung verwenden, um die Informationen der Tabelle anzuzeigen.

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

Probieren Sie es aus

In diesem Tutorial haben Sie gelernt, den PRIMARY KEY von SQLite zu verwenden Einschränkung, um den Primärschlüssel für eine Tabelle zu definieren.