Question

J'ai une table dans ma base de données avec un champ déclaré comme

_id integer primary key

Il n'y a pas d'auto-crème automatique.

Ici, j'ai un doute sur la mise à jour de RowID lors de l'insertion après une suppression.Ce que j'ai observé, c'est

  1. Si la dernière ligne ID est X et elle est supprimée, la ligne suivante insérée obtient ID X.

    Mais si je supprime d'autres lignes avec ID

    S'il vous plaît confirmer est mon droit d'observation (Rowid réutilisé uniquement si les dernières lignes sont supprimées et non entre rangées.)

    J'ai vu l'explication pour AutoIncrement.Je veux connaître le comportement quand aucun autocramenta n'est défini

Était-ce utile?

La solution

Le mot-clé Autooincretime n'est pas requis pour que les tables SQLITE génèrent automatiquement des valeurs de clé primaire .. Ce que vous ajoutez à la base de données sera ajouté comme la dernière ligne ... Donc, si vous supprimez la dernière ligne (x) .. Un nouveau élément sera ajouté à la position x. Si vous supprimez du milieu ou non. Nouveau élément surL'ajout ira à la position x + 1 ...

On augmente automatiquement .. Si vous supprimez le dernier élément à la position x ID Suivant X + 1 sera généré par algorithme automatique .. Makin l'ajout suivant à la position x + 1 ..

Autres conseils

Sans un ensemble d'autocrampe, la ligne serait un alias pour le Rowid ...

C'est ce que la FAQ dit:

Si aucun railid n'est spécifié sur l'insertion, ou si le membre de la ligne spécifiée a une valeur de NULL, une coureur appropriée est créée automatiquement. L'algorithme habituel est de donner la ligne nouvellement créée une rangée d'un railid qui est un plus grand que le plus grand rangid dans la table avant l'insertion. Si la table est initialement vide, un rabattable de 1 est utilisé. Si le plus grand rabattable est égal au plus grand entier possible (92233372036854775807), le moteur de base de données commence à choisir des membres candidats positifs au hasard jusqu'à ce qu'il ne soit pas utilisé auparavant. Si aucun rail inutilisé ne peut être trouvé après un nombre raisonnable de tentatives, l'opération d'insertion échoue avec une erreur SQLite_Full. Si aucune valeur négative des rabots ne sont insérées explicitement, les valeurs de RowID générés automatiquement seront toujours supérieures à zéro.

L'algorithme de sélection de Rowid normal décrit ci-dessus générera des railids uniques monotones aussi longs que vous n'utilisez jamais la valeur remplaçante maximale et que vous ne supprimez jamais l'entrée dans la table avec le plus grand rangid. Si vous supprimez déjà des lignes ou si vous créez une ligne avec le rafteur maximal possible, les rafteurs des rangées précédemment supprimés peuvent être réutilisés lors de la création de nouvelles lignes et des rails nouvellement créés pourraient ne pas être dans une commande strictement ascendante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top