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 full
Code 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.