45 votes

Y a-t-il un type de données UID dans SQLITE? Si oui, comment générer une 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 une valeur pour le champ id dans la table foobar ?

76voto

Vous pouvez soutenir que SQLite ne prend en charge aucun type de données. Dans SQLite3, vous pouvez faire ceci, par exemple.

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

SQLite créera facilement 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 sans problème.

Le point crucial pour vous est probablement comment générer automatiquement un uid. SQLite ne peut pas vous aider beaucoup à ce sujet.

Vous pouvez laisser cette tâche entièrement au programme client. Si vous programmez en python, utilisez le module uuid. En ruby, vous avez la fonction SecureRandom.uuid. D'autres langages ont des fonctionnalités similaires ou des solutions de contournement.

Vous pouvez écrire votre propre fonction de génération d'uid en C. (Voir Créer ou redéfinir des fonctions SQL.) Je considérerais cela comme une approche relativement extrême.

Vous pouvez le stocker soit au format binaire soit au format texte.


D'autres conversations en ligne suggèrent qu'il y a une incompréhension répandue 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.

25voto

APDent Points 446

La réponse de Benjamin Berry n'est pas correcte — elle produit des UUID mal formés — mais elle montre une technique intéressante en 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é 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

24voto

Mikael Lepistö Points 1040

Voici quelque chose de similaire qui peut être utilisé directement comme une 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 pour être passé comme valeur par défaut pour une 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

1voto

Benjamin Berry Points 51

Besoin de cela 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 
);

1voto

Anders Points 41

J'ai créé une fonction définie par l'utilisateur (pour générer la valeur par défaut d'une colonne guid/uuid dans mon application c#)

var connection = new SqliteConnection("DataSource=:memory:");
connection.CreateFunction("newid", Guid.NewGuid);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X