web-dev-qa-db-fra.com

Y a-t-il un type de données UID dans SQLITE si oui, alors comment générer de la valeur pour cela

Je crée une table comme ceci:

CREATE TABLE foobar (id uniqueidentifier, foo text, bar text, PRIMARY  KEY (id))

Comment insérer ou générer de la valeur pour le champ id dans la table foobar?

31
amy

Vous pouvez affirmer que SQLite ne prend pas du tout en charge les types de données . Dans SQLite3, vous pouvez le faire, par exemple.

sqlite> create table test (id wibblewibble primary key);

SQLite se fera un plaisir de créer une colonne avec le "type de données" wibblewibble. SQLite créera également des colonnes avec les "types de données" uuid, guid et SuperChicken.

Le point crucial pour vous est probablement de savoir comment générer automatiquement un uid. SQLite ne peut pas vous y aider beaucoup.

Vous pouvez le laisser entièrement au programme client. Si vous programmez en python, utilisez le module uuid . Dans Ruby, vous avez la fonction SecureRandom.uuid . D'autres langues ont des fonctionnalités ou des solutions de contournement similaires.

Vous pouvez écrire votre propre fonction génératrice d'uid en C. (Voir Créer ou redéfinir des fonctions SQL .) J'appellerais cela une approche relativement extrême.

Vous pouvez le stocker au format binaire ou texte .


D'autres conversations en ligne suggèrent qu'il existe un malentendu généralisé sur ce qu'est un UUID . Un UUID n'est pas simplement un nombre aléatoire de 128 bits. Un UUID a une structure et des règles. Voir RFC 4122 .

La réponse de Benjamin Berry n'est pas correcte - elle produit des UUID malformés - mais elle montre une technique intéressante utilisant une sous-sélection pour générer de l'aléatoire puis en sélectionnant des sous-chaînes à partir de cela. Voici quelque chose de similaire que j'ai confirmé que cela fonctionne:

select substr(u,1,8)||'-'||substr(u,9,4)||'-4'||substr(u,13,3)||
  '-'||v||substr(u,17,3)||'-'||substr(u,21,12) from (
    select lower(hex(randomblob(16))) as u, substr('89ab',abs(random()) % 4 + 1, 1) as v);

Quelques exemples de sortie:

c71122df-18e4-4a78-a446-fbf7b8f2969b
61e75f87-978b-4d9e-b587-bedcc2d23898
30eee0fa-2ff2-4ff5-b8ef-f99378272999
21
Tim Ruddick

Voici quelque chose de similaire qui peut être utilisé directement comme expression:

lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6)))

par exemple à passer comme valeur par défaut pour la colonne:

sqlite> create table "table" (
  "id" char(36) default (lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6)))), 
  "data" varchar(255), primary key ("id")
);

sqlite> insert into "table" ("data") values ('foo');
sqlite> insert into "table" ("data") values ('bar');
sqlite> select * from "table";
947efcc9-4212-442a-b68c-eb6fbd8a7128|foo
a2c3857b-1eb4-40bd-aed2-6e8d68cc2ab8|bar
16
Mikael Lepistö

avait besoin de ça pour un projet

select SUBSTR(UUID, 0, 8)||'-'||SUBSTR(UUID,8,4)||'-'||SUBSTR(UUID,12,4)||'-'||SUBSTR(UUID,16)
from (
select lower(hex(randomblob(16))) AS UUID 
);
2
Benjamin Berry