web-dev-qa-db-fra.com

Définir la valeur de départ pour AUTOINCREMENT dans SQLite

Comment puis-je définir la valeur de départ d'un champ AUTOINCREMENT dans SQLite?

51
Christian Davén

Insérez explicitement le value-1 dans le tableau, puis supprimez la ligne.

Modifier: le prochain commentaire vers le bas, qui traite de la modification du SQLITE_SEQUENCE la table directement est probablement préférable: https://stackoverflow.com/a/692871/1009

24
dave mankoff

Depuis le site Web SQLite :

SQLite conserve la trace du plus grand ROWID qu'une table ait jamais détenu à l'aide de la table spéciale SQLITE_SEQUENCE. La table SQLITE_SEQUENCE Est créée et initialisée automatiquement chaque fois qu'une table normale contenant une colonne AUTOINCREMENT est créée. Le contenu de la table SQLITE_SEQUENCE Peut être modifié à l'aide des instructions UPDATE, INSERT et DELETE ordinaires. Mais apporter des modifications à ce tableau perturbera probablement l'algorithme de génération de clé AUTOINCREMENT. Assurez-vous de savoir ce que vous faites avant d'entreprendre de tels changements.

J'ai essayé ça, et ça marche:

UPDATE SQLITE_SEQUENCE SET seq = <n> WHERE name = '<table>'

n + 1 est le prochain ROWID que vous souhaitez et table est le nom de la table.

89
Christian Davén

J'utilise la requête ci-dessous qui résout le problème lorsque sqlite_sequence n'a pas d'enregistrement pour la table (c'est-à-dire que le premier enregistrement n'a pas encore été ajouté à la table), sinon il met à jour la séquence.

BEGIN TRANSACTION;

UPDATE sqlite_sequence SET seq = <n> WHERE name = '<table>';

INSERT INTO sqlite_sequence (name,seq) SELECT '<table>', <n> WHERE NOT EXISTS 
           (SELECT changes() AS change FROM sqlite_sequence WHERE change <> 0);
COMMIT;
17
iTech

Une façon de le faire est d'insérer la première ligne en spécifiant explicitement l'ID de ligne avec lequel vous voulez commencer. SQLite insérera alors des identifiants de ligne supérieurs au précédent le plus élevé.

6
jle

En solution avec la table SQLITE_SEQUENCE, l'entrée dans cette table semble être ajoutée après la première insertion dans la table avec la colonne d'auto-incrémentation. Dans certains cas, cela peut provoquer des problèmes (c'est-à-dire que l'auto-incrémentation démarre toujours à partir de 1, pas à partir de la valeur souhaitée).

4
Raivo Laanemets

Je voulais juste ajouter quelques notes à la réponse très appréciée d'iTech:

  • La colonne de nom dans sqlite_sequence est sensible à la casse. (Peut-être que c'est moi seul, mais venant d'autres bases de données, je suppose toujours que la comparaison de chaînes ne respecte pas la casse).
  • SQLite semble être robuste: si le nombre dans sqlite_sequence est incorrect et conduit à une valeur de rowid dupliquée, sqlite utilisera le prochain numéro disponible pour le rowid (vérifié avec sqlite 3.28)
  • Il en va de même si la ligne de sqlite_sequence est supprimée.
  • J'ai utilisé comme suggéré dans un commentaire le "WHERE NOT EXISTS SELECT name from sqlite_sequence WHERE name = 'table'" au lieu de vérifier "changes ()"
1
Bernhard