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

c'Est possible d'utiliser GUID comme Clés primaires dans la Base de données SQLITE?Si Possible, quel type de données peut-on utiliser?

32
demandé sur mvp 2013-09-23 11:46:41

2 réponses

SQLite lui-même ne supporte pas GUID comme type interne.

sauf que C'est le cas! (en quelque sorte). Rappelez - vous, 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 SQLite types de données).

Selon ces règles, GUID le type a des affinités NONE, qui est le même que pour BLOB champs. Avec ceci à l'Esprit, vous pouvez créer la colonne de GUID tapez, et utilisez les règles suivantes pour accéder c':

  • conservez-le sous forme de chaîne comme X'01020304050607080910111213141516' (X notation est utilisée pour représenter 16 octets BLOB valeur). Pour insérer, utiliser:

    INSERT INTO mytable (uuid)
    VALUES (X'01020304050607080910111213141516');
    
  • Lire 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 aussi être utilisée comme clé primaire. Malheureusement, il n'y a pas de fonctionnalité D'auto-ordonnancement comme il existe pour les clés primaires entières - vous devrez le gérer m'. Vous pouvez utiliser quelque chose d'aussi simple que randomblob(16) pour cela, mais il n'est pas tout à fait UUID comme défini par standard.

Confusingly, vous pouvez également stocker la représentation de texte de UUID dans le même champ (SQLite ne vous empêchera pas de le faire), mais il faudra au moins 2x plus d'espace: BLOB est de 16 octets, UUID que le texte est d'au moins 32 octets.

30
répondu mvp 2013-09-23 08:23:05

sqlite3 n'a pas de format UUID natif de 128 bits, en soi.

cependant, les GUIDs peuvent être utilisés comme des clés dans SQLite comme un TEXT ou un binaire BLOB représentation.

basé sur les numéros de performance affichés en réponse à une question similaire, les UUIDs binaires et de chaîne peuvent être efficaces en SQLite pour créer et rechercher quand indexé.

voir le tableau dans: https://stackoverflow.com/a/11337522/3103448

SQLite peut générer des BLOB ou des UUIDs textuels avec randomblob(16) et hex(X) Par exemple: lower(hex(randomblob(16)))

avec un indice de performance similaire, un compromis significatif devient si un chaîne lisible par l'homme est préféré au taille plus petite des données binaires.

9
répondu l --marc l 2017-05-23 11:47:15