Utilisation des UUID dans SQLite

Est-il possible d'utiliser les valeursUUID comme clé primaire dans SQLite? Je trouve des informations extrêmement limitées sur le sujet, donc je ne suis pas sûr si SQLite prend même en charge un type de données UUID. Devrais-je stocker un UUID en tant que chaîne?

39
demandé sur Basil Bourque 2013-06-24 18:18:09

3 réponses

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 BLOBs de 16 octets (ce qui peut être plus rapide si les enregistrements sont si petits que la différence importe).

20
répondu CL. 2013-06-24 14:56:23

La réponse de CL est correcte mais contourne en quelque sorte le problème à portée de main. Comme mentionné, une colonne (ou plusieurs colonnes) de tout type peut être utilisée comme clé primaire. Donc, 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 de fonctionnalités qui supportent directement les UUID. SQLite utilise le type déclaré d'une colonne pour déterminer laquelle des cinq classes de stockage sous-jacentes (entier, réel, texte, blob ou null) elle utilisera. Mais le type déclaré d'une colonne est sinon ignoré. Il n'y a donc pas de types de colonnes ou de classes de stockage spécifiques à UUID. Il ne semble pas non plus y avoir de fonctions disponibles pour la conversion vers et depuis une chaîne UUID formatée. Pour obtenir les octets de votre UUID, vous voudrez pour voir quelles méthodes sont fournies par la langue dans laquelle votre application est écrite. Pour exmaple, la classe UUID de Java ou la classe Nsuuid D'Apple.

23
répondu spaaarky21 2017-12-11 17:18:58

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 un pseudo-aléatoire octet. Si N est inférieur à 1, un blob aléatoire de 1 octet est renvoyé. Astuce: les applications peuvent générer des identifiants uniques à l'échelle mondiale en utilisant ceci fonction hex() et/ou lower() comme ceci:

hex(randomblob(16)) 

Ou

lower(hex(randomblob(16))) 
4
répondu shtolik 2015-11-20 06:57:09