SQLite
 sql >> Base de données >  >> RDS >> SQLite

SQLite AUTOINCREMENT

Résumé :dans ce tutoriel, vous découvrirez SQLite AUTOINCREMENT attribut de colonne et quand l'utiliser dans votre tableau.

Introduction à SQLite ROWID tableau

Chaque fois que vous créez une table sans spécifier le WITHOUT ROWID option, vous obtenez une colonne d'auto-incrémentation implicite appelée rowid . Le rowid la colonne stocke un entier signé 64 bits qui identifie de manière unique une ligne dans la table.

Voyons l'exemple suivant.

Tout d'abord, créez une nouvelle table nommée people qui a deux colonnes :first_name, et last_name :

CREATE TABLE people (
   first_name TEXT NOT NULL,
   last_name TEXT NOT NULL
);Code language: SQL (Structured Query Language) (sql)

Essayez-le

Deuxièmement, insérez une ligne dans le people table en utilisant le INSERT suivant déclaration :

INSERT INTO people (first_name, last_name)
VALUES('John', 'Doe');Code language: SQL (Structured Query Language) (sql)

Essayez-le

Troisièmement, interrogez les données des people table en utilisant le SELECT suivant déclaration :

SELECT
   rowid,
   first_name,
   last_name
FROM
   people;Code language: SQL (Structured Query Language) (sql)

Essayez-le

Comme vous pouvez le voir clairement à partir de la sortie, SQLite crée implicitement une colonne nommée rowid et attribue automatiquement une valeur entière chaque fois que vous insérez une nouvelle ligne dans le tableau.

Notez que vous pouvez également vous référer au rowid colonne en utilisant ses alias :_rowid_ et oid .

Lorsque vous créez une table qui a une INTEGER PRIMARY KEY colonne, cette colonne est l'alias du rowid colonne.

L'instruction suivante supprime la table people et le recrée. Cette fois, cependant, nous ajoutons une autre colonne nommée person_id dont le type de données est INTEGER et la contrainte de colonne est 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)

Essayez-le

Dans ce cas, le person_id colonne est en fait le rowid colonne.

Comment SQLite attribue-t-il une valeur entière au rowid colonne ?

Si vous ne spécifiez pas le rowid valeur ou vous utilisez un NULL valeur lorsque vous insérez une nouvelle ligne, SQLite attribue automatiquement le prochain entier séquentiel, qui est un plus grand que le plus grand rowid dans la table. Le rowid la valeur commence à 1.

La valeur maximale de rowid la colonne est 9,223,372,036,854,775,807 , ce qui est très grand. Si vos données atteignent cette valeur maximale et que vous essayez d'insérer une nouvelle ligne, SQLite trouvera un entier inutilisé et l'utilisera. Si SQLite ne trouve aucun entier inutilisé, il émettra un SQLITE_FULL Erreur. En plus de cela, si vous supprimez des lignes et insérez une nouvelle ligne, SQLite essaiera de réutiliser le rowid valeurs des lignes supprimées.

Faisons un test dessus.

Tout d'abord, insérez une ligne avec la valeur maximale dans le people tableau.

INSERT INTO people (person_id,first_name,last_name)
VALUES(	9223372036854775807,'Johnathan','Smith');Code language: SQL (Structured Query Language) (sql)

Essayez-le

Deuxièmement, insérez une autre ligne sans spécifier de valeur pour le person_id colonne :

INSERT INTO people (first_name,last_name)
VALUES('William','Gate');Code language: SQL (Structured Query Language) (sql)

Essayez-le

Comme indiqué clairement dans la sortie, la nouvelle ligne a reçu un entier inutilisé.

Prenons un autre exemple.

Tout d'abord, créez une nouvelle table nommée t1 qui a une colonne :

CREATE TABLE t1(c text);Code language: SQL (Structured Query Language) (sql)

Deuxièmement, insérez quelques lignes dans le t1 tableau :

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)

Troisièmement, interrogez les données du t1 tableau :

SELECT rowid, c FROM t1;Code language: SQL (Structured Query Language) (sql)

Quatrièmement, supprimez toutes les lignes du t1 tableau :

DELETE FROM t1;Code language: SQL (Structured Query Language) (sql)

Cinquièmement, insérez quelques lignes dans le t1 tableau :

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)

Enfin, interrogez les données du t1 tableau :

SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)

Comme vous pouvez le voir, les rowid 1, 2 et 3 ont été réutilisés pour les nouvelles lignes.

SQLite AUTOINCREMENT attribut de colonne

SQLite vous déconseille d'utiliser AUTOINCREMENT attribut car :

L'AUTOINCREMENT Le mot-clé impose un processeur supplémentaire, de la mémoire, de l'espace disque et une surcharge d'E/S disque et doit être évité s'il n'est pas strictement nécessaire. Ce n'est généralement pas nécessaire.

De plus, la façon dont SQLite attribue une valeur pour le AUTOINCREMENT colonne légèrement différente de la façon dont elle le fait pour le rowid colonne.

Prenons l'exemple suivant.

Tout d'abord, déposez et recréez les people table. Cette fois, nous utilisons AUTOINCREMENT colonne d'attribut :

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)

Essayez-le

Deuxièmement, insérez une ligne avec le maximum rowid valeur dans les people tableau.

INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');Code language: SQL (Structured Query Language) (sql)

Essayez-le

Troisièmement, insérez une autre ligne dans le people tableau.

INSERT INTO people (first_name,last_name)
VALUES('John','Smith');Code language: SQL (Structured Query Language) (sql)

Essayez-le

Cette fois, SQLite a émis un message d'erreur car le person_id la colonne n'a pas réutilisé le numéro comme un rowid colonne.

[Err] 13 - database or disk is fullCode language: SQL (Structured Query Language) (sql)

Quand utiliser l'AUTOINCREMENT attribut de colonne ?

Le but principal de l'utilisation de l'attribut AUTOINCREMENT est d'empêcher SQLite de réutiliser une valeur qui n'a pas été utilisée ou une valeur de la ligne précédemment supprimée.

Si vous n'avez aucune exigence de ce type, vous ne devez pas utiliser le AUTOINCREMENT attribut dans la clé primaire.

Dans ce tutoriel, vous avez appris comment SQLite AUTOINCREMENT fonctionne et comment il influence la façon dont SQLite attribue des valeurs à la colonne de clé primaire.