web-dev-qa-db-fra.com

Utiliser du texte comme clé primaire dans une table SQLite

Est-ce mauvais d’avoir du texte comme clé primaire dans une base de données SQLite? J'ai entendu dire que c'était mauvais pour des raisons de performance, est-ce vrai? Et le rowid sera-t-il utilisé comme clé primaire réelle dans un tel cas?

16
mpellegr

Est-ce mauvais d’avoir du texte comme clé primaire dans une base de données SQLite? J'ai entendu dire que c'était mauvais pour des raisons de performance, est-ce vrai?

Du point de vue de l'exactitude, TEXT PRIMARY KEY est correct.

Du point de vue des performances, préférez les clés INTEGER. Mais comme pour tout problème de performances, mesurez-le vous-même pour voir s'il existe une différence significative avec vos données et vos cas d'utilisation.

Et le rowid sera-t-il utilisé comme clé primaire réelle dans un tel cas?

Seul INTEGER PRIMARY KEY est aliasé avec ROWID. Les autres types de clés primaires ne le sont pas, et il y aura un entier implicite, rowid, sauf si WITHOUT ROWID est spécifié. Référence .

22
laalto

Dans le monde réel, l'utilisation de chaînes en tant que clé primaire présente de nombreux avantages si nous parlons d'UUID. Le fait de pouvoir créer un "passeport" d'entité exactement au moment de sa création peut considérablement simplifier le code asynchrone et/ou le système distribué (si nous parlons d'une architecture client/serveur mobile plus complexe). 

En ce qui concerne les performances, je n'ai trouvé aucune différence mesurable lors de l'exécution d'un test de performances pour effectuer 10000 recherches de clé primaire. En réalité, les index de base de données ne stockent ni ne comparent les chaînes lors de l'exécution de recherches indexées.

9
Segabond

Oui, si vous utilisez TEXT, vous obtenez Android.database.sqlite.SQLiteConstraintException: la contrainte UNIQUE a échoué: Nom de la table.Nom de la colonne (code 1555)

SQLite a une session pour insérer et renvoyer l'ID de la dernière ligne insérée, si cette insertion réussit. Sinon retournera -1.

return est mappé sur _ID, c'est la raison pour laquelle ils vous obligent à utiliser BaseColumns pour la table

son étrange appel d'insert doit renvoyer le rowid, au lieu d'un booléen ou alors

Je souhaite que la capacité de TEXT PRIMARY KEY soit présente dans sqlite

0
Bipin