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:
- In primo luogo, disattiva il controllo della constarint della chiave esterna.
- Successivamente, rinomina la tabella con un altro nome di tabella (vecchia_tabella)
- Quindi, crea una nuova tabella (tabella) con la struttura esatta della tabella che ti è stata rinominata.
- Dopodiché, copia i dati dalla old_table alla tabella.
- 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.