web-dev-qa-db-fra.com

Pouvons-nous utiliser Guid comme clé primaire dans la base de données Sqlite

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é?

34
user2134137

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.

33
mvp

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 .

10
l --marc l