web-dev-qa-db-fra.com

Existe-t-il une incrémentation automatique dans sqlite?

J'essaie de créer une table avec un primary key Auto-incrémenté dans Sqlite . Je ne sais pas si cela est vraiment possible, mais j'espère ne devoir désigner que les autres domaines.

Par exemple:

CREATE TABLE people (id integer primary key auto increment, first_name varchar(20), last_name varchar(20));

Ensuite, lorsque j'ajoutais une valeur, j'espérais n'avoir qu'à faire:

INSERT INTO people
VALUES ("John", "Smith");

Est-ce seulement possible?

J'utilise sqlite3 Sous cygwin sous Windows 7.

93
ewok

Vous en obtenez un gratuitement, appelé ROWID. Cela se trouve dans chaque table SQLite, que vous le demandiez ou non.

Si vous incluez une colonne de type INTEGER PRIMARY KEY, cette colonne pointe sur (est un alias pour) la colonne ROWID automatique.

ROWID (quel que soit le nom que vous appelez) reçoit une valeur chaque fois que vous INSÉREZ une ligne, comme vous le souhaitiez. Si vous affectez explicitement une valeur non NULL à INSERT, il obtiendra cette valeur spécifiée au lieu de l'incrémentation automatique. Si vous affectez explicitement une valeur NULL à INSERT, la prochaine valeur à incrémentation automatique sera obtenue.

Aussi, vous devriez essayer d'éviter:

 INSERT INTO people VALUES ("John", "Smith");

et utilise

 INSERT INTO people (first_name, last_name) VALUES ("John", "Smith");

au lieu. La première version est très fragile - si vous ajoutez, déplacez ou supprimez des colonnes dans votre définition de table, la commande INSERT échouera ou produira des données incorrectes (avec les valeurs dans les colonnes incorrectes).

146
Larry Lustig

Oui, c'est possible Selon le FAQ SQLite :

Une colonne déclarée INTEGER PRIMARY KEY sera auto-incrémenté.

47
Matt Hulse

À partir d'aujourd'hui - juin 2018


Voici ce que documentation officielle de SQLite a à dire sur le sujet (gras et italique sont les miens):

  1. Le mot clé [~ # ~] auto-incrémenté [~ # ~] impose une surcharge de ressources processeur, mémoire, espace disque et I/O disque devrait être évité s'il n'est pas strictement nécessaire. Il n'est généralement pas nécessaire.

  2. Dans SQLite, une colonne de type INTEGER PRIMARY KEY est un alias pour le [~ # ~] rowid [~ # ~] (sauf dans les tables WITHOUT ROWID), qui est toujours un entier signé de 64 bits.

  3. Sur un INSERT, si la colonne ROWID ou INTEGER PRIMARY KEY n'est pas explicitement donnée, elle sera alors rempli automatiquement avec un entier non utilisé, généralement un de plus que le plus grand ROWID actuel use. Ceci est vrai que le mot clé AUTOINCREMENT soit utilisé ou non.

  4. Si le mot clé [~ # ~] auto-incrémenté [~ # ~] apparaît après INTEGER PRIMARY KEY , qui modifie l'algorithme d'affectation automatique ROWID en empêche la réutilisation des ROWID pendant la durée de vie de la base de données. En d’autres termes, le but de AUTOINCREMENT est d’empêcher la réutilisation de ROWID à partir de lignes précédemment supprimées.

14
Filipp W.

Avez-vous lu ceci? Comment créer un champ AUTOINCREMENT.

INSERT INTO people
VALUES (NULL, "John", "Smith");
9
Uku Loskit

On ne devrait pas spécifier AUTOINCREMENT mot-clé près de PRIMARY KEY. Exemple de création de clé primaire auto-incrémentée et d’insertion:

$ sqlite3 ex1

CREATE TABLE IF NOT EXISTS room(room_id INTEGER PRIMARY KEY, name VARCHAR(25) NOT NULL, home_id VARCHAR(25) NOT NULL);

INSERT INTO room(name, home_id) VALUES ('test', 'home id test');

INSERT INTO room(name, home_id) VALUES ('test 2', 'home id test 2');

SELECT * FROM room;

va donner:

1|test|home id test
2|test 2|home id test 2
3
wzbozon

SQLite AUTOINCREMENT est un mot clé utilisé pour incrémenter automatiquement la valeur d'un champ de la table. Nous pouvons auto-incrémenter une valeur de champ en utilisant le mot-clé AUTOINCREMENT lors de la création d'une table avec un nom de colonne spécifique pour l'incrémenter automatiquement.

Le mot-clé AUTOINCREMENT peut être utilisé avec le champ INTEGER uniquement. Syntaxe:

L'utilisation de base du mot clé AUTOINCREMENT est la suivante:

CREATE TABLE nom_table (column1 INTEGER AUTOINCREMENT, type de données column2, type de données column3, ..... type de données columnN,);

Par exemple, voir ci-dessous: Envisagez de créer la table COMPANY comme suit:

sqlite> CREATE TABLE TB_COMPANY_INFO (ID INTEGER PRIMARY KEY AUTOINCREMENT, NOM TEXTE NON NULL, AGE INT NON NULL, ADRESSE CHAR (50), SALARY REAL);

Maintenant, insérez les enregistrements suivants dans la table TB_COMPANY_INFO:

INSERT INTO TB_COMPANY_INFO (NOM, ÂGE, ADRESSE, SALAIRE), VALEURS ('MANOJ KUMAR', 40 ans, 'Meerut, UP, INDIA', 200000.00);

Maintenant, sélectionnez l’enregistrement SELECT * FROM TB_COMPANY_INFO ID NOM ADRESSE D’ÂGE SALAIRE 1 Manoj Kumar 40 Meerut, UP, INDIA 200000.00

2
mkumar0304

En plus de rowid, vous pouvez définir votre propre champ d’incrémentation automatique, mais cela n’est pas recommandé. C'est toujours une meilleure solution lorsque nous utilisons rowid qui est automatiquement augmenté.

Le mot clé AUTOINCREMENT impose une surcharge de ressources processeur, mémoire, espace disque et 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.

Lire ici pour des informations détaillées.

2
sonvx

Je sais que cette réponse est un peu en retard.
Mon objectif pour cette réponse est de fournir une référence à tout le monde s’ils rencontrent ce type de problème avec SQLite maintenant ou à l’avenir et qu’ils ont du mal à l’atteindre.

Maintenant, en regardant votre requête, cela devrait être quelque chose comme ça.

CREATE TABLE people (id integer primary key autoincrement, first_name varchar(20), last_name varchar(20));

Cela fonctionne de mon côté. Ainsi,

enter image description here

Juste au cas où vous travailliez avec SQLite, je vous suggère de vérifier Navigateur DB pour SQLite . Fonctionne également sur différentes plateformes.

1
Kent Aguilar