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

Chiave primaria SQLite

Riepilogo :in questo tutorial imparerai come usare SQLite PRIMARY KEY vincolo per definire una chiave primaria per una tabella.

Introduzione alla chiave primaria SQLite

Una chiave primaria è una colonna o un gruppo di colonne utilizzato per identificare l'unicità delle righe in una tabella. Ogni tabella ha una e una sola chiave primaria.

SQLite ti consente di definire la chiave primaria in due modi:

Innanzitutto, se la chiave primaria ha una sola colonna, utilizzi la PRIMARY KEY vincolo di colonna per definire la chiave primaria come segue:

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

In secondo luogo, nel caso in cui la chiave primaria sia composta da due o più colonne, si utilizza la PRIMARY KEY vincolo di tabella per definire il primario come mostrato nella seguente istruzione.

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)

Nello standard SQL, la colonna della chiave primaria non deve contenere NULL valori. Significa che la colonna della chiave primaria ha un implicito NOT NULL vincolo.

Tuttavia, per rendere la versione corrente di SQLite compatibile con la versione precedente, SQLite consente alla colonna della chiave primaria di contenere NULL valori.

Chiave primaria SQLite e tabella rowid

Quando crei una tabella senza specificare il WITHOUT ROWID opzione, SQLite aggiunge una colonna implicita chiamata rowid che memorizza l'intero con segno a 64 bit. Il rowid colonna è una chiave che identifica in modo univoco le righe nella tabella. Tabelle che hanno rowid le colonne sono chiamate rowid tabelle.

Se una tabella ha la chiave primaria che consiste in una colonna e quella colonna è definita come INTEGER quindi questa colonna della chiave primaria diventa un alias per il rowid colonna.

Nota che se assegni un altro tipo intero come BIGINT e UNSIGNED INT alla colonna della chiave primaria, questa colonna non sarà un alias per il rowid colonna.

Perché il rowid table organizza i suoi dati come un albero B, interrogando e ordinando i dati di un rowid tavolo sono molto veloci. È più veloce dell'utilizzo di una chiave primaria che non è un alias di rowid .

Un'altra nota importante è che se dichiari una colonna con INTEGER digitare e PRIMARY KEY DESC clausola, questa colonna non diventerà un alias per il rowid colonna:

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

Creazione di esempi di chiavi primarie SQLite

La seguente istruzione crea una tabella denominata countries che ha country_id colonna come chiave primaria.

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

Provalo

Perché la chiave primaria dei countries table ha una sola colonna, abbiamo definito la chiave primaria usando PRIMARY KEY vincolo di colonna.

È possibile utilizzare la PRIMARY KEY vincolo di tabella per definire la chiave primaria costituita da una colonna come mostrato nella seguente istruzione:

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

Provalo

Tuttavia, per le tabelle in cui le chiavi primarie sono costituite da più di una colonna, è necessario utilizzare PRIMARY KEY vincolo di tabella per definire le chiavi primarie.

La seguente istruzione crea il country_languages tabella la cui chiave primaria è composta da due colonne.

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)

Provalo

Aggiunta di esempio di chiave primaria SQLite

A differenza di altri sistemi di database, ad esempio MySQL e PostgreSQL, non è possibile utilizzare ALTER TABLE istruzione per aggiungere una chiave primaria a una tabella esistente.

È necessario seguire questi passaggi per aggirare la limitazione:

  1. In primo luogo, disattiva il controllo della constarint della chiave esterna.
  2. Successivamente, rinomina la tabella con un altro nome di tabella (vecchia_tabella)
  3. Quindi, crea una nuova tabella (tabella) con la struttura esatta della tabella che ti è stata rinominata.
  4. Dopodiché, copia i dati dalla old_table alla tabella.
  5. Infine, attiva il controllo del vincolo della chiave esterna

Vedi le seguenti affermazioni:

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)

Provalo

Il BEGIN TRANSACTION avvia una nuova transazione. Garantisce che tutte le istruzioni successive vengano eseguite correttamente o che non venga eseguito nulla.

Il COMMIT dichiarazione impegna tutte le dichiarazioni.

Creiamo una tabella con il nome cities senza una chiave primaria.

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)

Provalo

Per aggiungere la chiave primaria alle cities tabella, esegui i seguenti passaggi:

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)

Provalo

Se utilizzi lo strumento GUI SQLite, puoi utilizzare la seguente istruzione per mostrare le informazioni della tabella.

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

Provalo

In questo tutorial, hai imparato a usare SQLite PRIMARY KEY vincolo per definire la chiave primaria per una tabella.