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

Créer une colonne d'auto-incrémentation dans SQLite

SQLite a une manière intéressante de gérer les colonnes à incrémentation automatique. Par colonnes à incrémentation automatique, j'entends des colonnes qui s'incrémentent automatiquement chaque fois que de nouvelles données sont insérées.

Ceci est similaire à un IDENTITY colonne dans SQL Server ou un AUTO_INCREMENT colonne dans MySQL .

Cet article explique comment créer AUTOINCREMENT colonnes dans SQLite.

Créer automatiquement une colonne à incrémentation automatique

Par défaut, lorsque vous définissez une colonne comme INTEGER PRIMARY KEY , il s'incrémentera automatiquement chaque fois que vous insérez NULL dans cette colonne.

Exemple :

CREATE TABLE Cats( 
    CatId INTEGER PRIMARY KEY, 
    CatName
);

Dans ce tableau, le CatId colonne est une colonne d'auto-incrémentation. C'est parce qu'il a été défini à l'aide de INTEGER PRIMARY KEY .

Maintenant, lorsque j'insère NULL dans cette colonne, le CatId incrémentation automatique des colonnes :

INSERT INTO Cats VALUES 
    ( NULL, 'Brush' ),
    ( NULL, 'Scarcat' ),
    ( NULL, 'Flutter' );

SELECT * FROM Cats;

Résultat :

CatId       CatName   
----------  ----------
1           Brush     
2           Scarcat   
3           Flutter   

Il est important de noter que vous pouvez remplacer le AUTOINCREMENT valeur en insérant votre propre valeur. En d'autres termes, AUTOINCREMENT n'insère une valeur que si vous ne le faites pas.

La façon dont cela fonctionne est, le NULL est automatiquement converti en un nombre entier supérieur d'une unité à la plus grande valeur de cette colonne sur toutes les autres lignes du tableau. Si le tableau est vide, la valeur sera 1 .

Si la plus grande valeur de la colonne est le plus grand entier possible (9223372036854775807), alors SQLite choisira une clé inutilisée au hasard. Cela signifie généralement qu'il réutilisera les anciennes clés précédemment supprimées. Si une clé inutilisée est introuvable, le INSERT l'opération échoue avec un SQLITE_FULL Erreur.

En gros, cela signifie que si vous autorisez DELETE opérations dans la table, il n'y a aucune garantie que toutes les lignes seront dans l'ordre. Il est possible que certaines lignes aient une valeur supérieure à celle des lignes insérées ultérieurement.

Par conséquent, dans de tels cas, vous ne pouvez pas vous fier à cette colonne si vous devez ordonner le tableau par ordre croissant ou décroissant, en fonction de l'ordre dans lequel les lignes ont été insérées.

Heureusement, si cela vous pose problème, il existe une solution :L'AUTOINCREMENT mot-clé.

Utilisez le mot-clé AUTOINCREMENT

Alternativement, vous pouvez choisir de définir explicitement l'auto-incrémentation de la colonne en utilisant le AUTOINCREMENT mot-clé.

L'un des avantages de l'utilisation de cette méthode est qu'elle garantit que toutes les lignes seront dans l'ordre croissant. En effet, il ne réutilise pas les clés précédemment supprimées. Chaque clé sera toujours une de plus que la plus grande clé qui ait jamais existé dans cette table. Si la plus grande clé possible a déjà existé dans cette table, alors elle ne le fera pas essayez d'utiliser des clés précédemment supprimées. Le INSERT échouera avec un SQLITE_FULL code d'erreur.

L'inconvénient d'utiliser l'AUTOINCREMENT Le mot-clé est qu'il utilise un CPU, de la mémoire, de l'espace disque et une surcharge d'E/S de disque supplémentaires.

Voici un exemple de création d'une colonne auto-incrémentée avec le AUTOINCREMENT mot-clé :

CREATE TABLE Dogs( 
    DogId INTEGER PRIMARY KEY AUTOINCREMENT, 
    DogName
);

Insérez maintenant les données et sélectionnez-les :

INSERT INTO Dogs VALUES 
    ( NULL, 'Yelp' ),
    ( NULL, 'Woofer' ),
    ( NULL, 'Fluff' );

SELECT * FROM Dogs;

Résultat :

DogId       DogName   
----------  ----------
1           Yelp      
2           Woofer    
3           Fluff     

Si je devais supprimer Fluff à partir de ce tableau, puis insérez une nouvelle ligne (en utilisant NULL comme DogId), le nouveau DogId serait 4. En d'autres termes, il ne réutiliserait pas 3.

Si la colonne avait été créée sans l'AUTOINCREMENT mot-clé, la ligne suivante réutilisera le DogId de 3.

Si je devais insérer un DogId de 9223372036854775807 (le plus grand entier possible), je recevrais l'erreur suivante lors de la prochaine insertion qui spécifie NULL pour cette colonne :

Error: database or disk is full

Cependant, je pourrais explicitement insérer une valeur inférieure à 9223372036854775807, tant que cette valeur n'est pas déjà utilisée par une autre ligne, et le INSERT l'opération devrait réussir sans l'erreur ci-dessus.

Fondamentalement, une fois que vous atteignez 9223372036854775807, l'auto-incrémentation ne fonctionnera plus.

Colonnes définies sans AUTOINCREMENT mot clé n'ont pas ce problème. Ils reviendront automatiquement en arrière et essaieront de trouver un entier inutilisé à utiliser à la place. Cependant, si tous les entiers ont été utilisés (c'est-à-dire que le tableau contient en fait 9223372036854775807 lignes), alors même ces colonnes entraîneront l'erreur ci-dessus.