web-dev-qa-db-fra.com

Utilisation des UUID dans SQLite

Est-il possible d'utiliser les valeurs UUID comme clé primaire dans SQLite? Je trouve des informations extrêmement limitées sur le sujet, donc je ne sais pas si SQLite prend même en charge un type de données UUID. Dois-je stocker un UUID sous forme de chaîne?

48
Mike Baxter

SQLite permet d'utiliser n'importe quel type de données comme clé primaire.

Les UUID peuvent être stockés sous forme de chaînes (lisibles par l'homme) ou de BLOB de 16 octets (ce qui pourrait être plus rapide si les enregistrements sont si petits que la différence compte).

25
CL.

La réponse de CL est correcte mais contourne le problème en cours. Comme mentionné, une colonne (ou plusieurs colonnes) de tout type peut être utilisée comme clé primaire. Ainsi, vous pourriez stocker l'UUID dans le format de chaîne formaté et lisible par l'homme et en faire la clé de votre table. Et comme un UUID n'est qu'un entier de 128 bits, vous pouvez également stocker les octets de l'entier en tant que BLOB, ce qui, j'imagine, serait légèrement plus rapide.

Mais pour répondre plus directement à ce que je crois être la question à portée de main, non, SQLite n'a pas des fonctionnalités qui prennent directement en charge les UUID. Lorsque SQLite crée une table, il utilise le type déclaré d'une colonne pour déterminer lequel des cinq sous-jacents classes de stockage (entier, réel, texte, blob ou null) il utilisera. Mais le type déclaré d'une colonne est sinon ignoré. Il n'y a donc pas de types de colonne ou de classes de stockage spécifiques à l'UUID. Il ne semble pas non plus y avoir fonctions disponibles pour la conversion vers et depuis une chaîne UUID formatée. Pour obtenir les octets de votre UUID, vous voudrez voir quelles méthodes sont fournies par le langage dans lequel votre application est écrite. Par exemple, la classe UUID de Java ou Apple NSUUID .

26
spaaarky21

Pas sûr de l'utiliser comme champ par défaut, mais si quelqu'un a besoin de générer une valeur unique dans la requête sqlite, l'approche suivante suggérée ici peut être utilisée:

La fonction randomblob (N) renvoie un blob de N octets contenant des octets pseudo-aléatoires. Si N est inférieur à 1, un blob aléatoire de 1 octet est renvoyé. Astuce: les applications peuvent générer des identificateurs globalement uniques en utilisant cette fonction avec hex () et/ou lower () comme ceci:

hex(randomblob(16)) 

ou

lower(hex(randomblob(16))) 
3
shtolik