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

SQLite AUTOINCREMENTO

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 fullCode 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.