Est-il possible d'utiliser GUID comme clés primaires dans la base de données SQLITE? Si possible quel type de données peut être utilisé?
SQLite lui-même ne prend pas en charge GUID
comme type interne.
Sauf que ça marche! (sorte de). N'oubliez pas, dans SQLite, n'importe quelle chaîne peut être utilisée comme nom de type, et cela inclut GUID
ou UUID
(en savoir plus sur types de données SQLite ).
Selon ces règles, le type GUID
a une affinité NONE
, qui est la même que pour les champs BLOB
. Dans cet esprit, vous pouvez créer une colonne de type GUID
et utiliser les règles suivantes pour y accéder:
Stockez-le sous forme de chaîne comme X'01020304050607080910111213141516'
(La notation X est utilisée pour représenter une valeur de 16 octets BLOB
). Pour insérer, utilisez:
INSERT INTO mytable (uuid)
VALUES (X'01020304050607080910111213141516');
Lisez-le au format 16 octets BLOB
. quote(uuid)
peut être utilisé pour formater la sortie en utilisant la notation X:
SELECT quote(uuid)
FROM mytable
Cette colonne peut également être utilisée comme clé primaire. Malheureusement, il n'y a pas de fonctionnalité AUTOINCREMENT telle qu'elle existe pour les clés primaires entières - vous devrez la gérer vous-même. Vous pouvez utiliser quelque chose d'aussi simple que randomblob(16)
pour cela, mais ce n'est pas tout à fait UUID
tel que défini par standard .
De manière confuse, vous pouvez également stocker la représentation textuelle de l'UUID dans le même champ (SQLite ne vous en empêchera pas), mais cela prendra au moins 2x plus d'espace: BLOB est de 16 octets, UUID en tant que texte est d'au moins 32 octets.
sqlite3
N'a pas de format UUID natif 128 bits en soi.
Cependant, les GUID peuvent être utilisés comme clés dans SQLite en tant que représentation TEXT
ou binaire BLOB
.
Sur la base des chiffres de performances publiés en réponse à une question similaire, les UUID binaires et de chaîne peuvent être efficaces dans SQLite pour Create et Query lorsqu'ils sont indexés.
voir le tableau dans: https://stackoverflow.com/a/11337522/3103448
SQLite peut générer des UOBs BLOB ou TEXT avec randomblob(16)
et hex(X)
Par exemple: lower(hex(randomblob(16)))
Avec des performances d'index similaires, un compromis important est de savoir si une chaîne lisible par l'homme est préférée à la taille des données binaires plus petite .