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