Riepilogo :in questo tutorial imparerai a conoscere SQLite AUTOINCREMENT
attributo della colonna e quando utilizzarlo nella tabella.
Introduzione a SQLite ROWID
tabella
Ogni volta che crei una tabella senza specificare il WITHOUT ROWID
opzione, ottieni una colonna di incremento automatico implicita chiamata rowid
. Il rowid
archivio di colonne intero con segno a 64 bit che identifica in modo univoco una riga nella tabella.
Vediamo il seguente esempio.
Innanzitutto, crea una nuova tabella denominata people
che ha due colonne:first_name,
e last_name
:
CREATE TABLE people (
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Provalo
In secondo luogo, inserisci una riga in people
tabella utilizzando il seguente INSERT
dichiarazione:
INSERT INTO people (first_name, last_name)
VALUES('John', 'Doe');
Code language: SQL (Structured Query Language) (sql)
Provalo
Terzo, interroga i dati dalle people
tabella utilizzando il seguente SELECT
dichiarazione:
SELECT
rowid,
first_name,
last_name
FROM
people;
Code language: SQL (Structured Query Language) (sql)
Provalo

Come puoi vedere chiaramente dall'output, SQLite crea implicitamente una colonna denominata rowid
e assegna automaticamente un valore intero ogni volta che inserisci una nuova riga nella tabella.
Nota che puoi anche fare riferimento a rowid
colonna usando i suoi alias:_rowid_
e oid
.
Quando crei una tabella che ha una INTEGER PRIMARY KEY
colonna, questa colonna è l'alias di rowid
colonna.
La seguente istruzione elimina la tabella people
e lo ricrea. Questa volta, tuttavia, aggiungiamo un'altra colonna denominata person_id
il cui tipo di dati è INTEGER
e il vincolo di colonna è PRIMARY KEY
:
DROP TABLE people;
CREATE TABLE people (
person_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Provalo
In questo caso, il person_id
la colonna è in realtà il rowid
colonna.
In che modo SQLite assegna un valore intero al rowid
colonna?
Se non specifichi il rowid
valore o usi un NULL
valore quando si inserisce una nuova riga, SQLite assegna automaticamente il successivo intero sequenziale, che è uno più grande della rowid
più grande sul tavolo. Il rowid
il valore inizia da 1.
Il valore massimo di rowid
la colonna è 9,223,372,036,854,775,807
, che è molto grande. Se i tuoi dati raggiungono questo valore massimo e tenti di inserire una nuova riga, SQLite troverà un intero inutilizzato e lo utilizzerà. Se SQLite non riesce a trovare alcun numero intero inutilizzato, emetterà un SQLITE_FULL
errore. Inoltre, se elimini alcune righe e ne inserisci una nuova, SQLite proverà a riutilizzare il rowid
valori dalle righe eliminate.
Facciamo un test su di esso.
Innanzitutto, inserisci una riga con il valore massimo nelle people
tabella.
INSERT INTO people (person_id,first_name,last_name)
VALUES( 9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Provalo

In secondo luogo, inserisci un'altra riga senza specificare un valore per person_id
colonna:
INSERT INTO people (first_name,last_name)
VALUES('William','Gate');
Code language: SQL (Structured Query Language) (sql)
Provalo

Come mostrato chiaramente nell'output, la nuova riga ha ricevuto un numero intero non utilizzato.
Considera un altro esempio.
Innanzitutto, crea una nuova tabella denominata t1
che ha una colonna:
CREATE TABLE t1(c text);
Code language: SQL (Structured Query Language) (sql)
In secondo luogo, inserisci alcune righe nel t1
tabella:
INSERT INTO t1(c) VALUES('A');
INSERT INTO t1(c) values('B');
INSERT INTO t1(c) values('C');
INSERT INTO t1(c) values('D');
Code language: SQL (Structured Query Language) (sql)
Terzo, interroga i dati da t1
tabella:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)

In quarto luogo, elimina tutte le righe di t1
tabella:
DELETE FROM t1;
Code language: SQL (Structured Query Language) (sql)
Quinto, inserisci alcune righe nel t1
tabella:
INSERT INTO t1(c) values('E');
INSERT INTO t1(c) values('F');
INSERT INTO t1(c) values('G');
Code language: SQL (Structured Query Language) (sql)
Infine, interroga i dati da t1
tabella:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)

Come puoi vedere, i rowid 1, 2 e 3 sono stati riutilizzati per le nuove righe.
SQLite AUTOINCREMENT
attributo di colonna
SQLite consiglia di non utilizzare AUTOINCREMENT
attributo perché:
Il
AUTOINCREMENT
la parola chiave impone ulteriore CPU, memoria, spazio su disco e sovraccarico di I/O del disco e dovrebbe essere evitata se non strettamente necessario. Di solito non è necessario.
Inoltre, il modo in cui SQLite assegna un valore per AUTOINCREMENT
colonna leggermente diversa da quella per rowid
colonna.
Considera il seguente esempio.
Per prima cosa, rilascia e ricrea le people
tavolo. Questa volta utilizziamo AUTOINCREMENT
colonna attributo:
DROP TABLE people;
CREATE TABLE people (
person_id INTEGER PRIMARY KEY AUTOINCREMENT,
first_name text NOT NULL,
last_name text NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Provalo
In secondo luogo, inserisci una riga con il massimo rowid
valore nelle people
tabella.
INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Provalo
Terzo, inserisci un'altra riga nelle people
tabella.
INSERT INTO people (first_name,last_name)
VALUES('John','Smith');
Code language: SQL (Structured Query Language) (sql)
Provalo
Questa volta, SQLite ha emesso un messaggio di errore perché person_id
la colonna non ha riutilizzato il numero come un rowid
colonna.
[Err] 13 - database or disk is full
Code language: SQL (Structured Query Language) (sql)
Quando dovresti usare il AUTOINCREMENT
attributo di colonna?
Lo scopo principale dell'utilizzo dell'attributo AUTOINCREMENT
è impedire a SQLite di riutilizzare un valore che non è stato utilizzato o un valore dalla riga precedentemente eliminata.
Se non hai alcun requisito come questo, non dovresti utilizzare AUTOINCREMENT
attributo nella chiave primaria.
In questo tutorial, hai imparato come SQLite AUTOINCREMENT
attributo funziona e come influenza il modo in cui SQLite assegna i valori alla colonna della chiave primaria.