2012-04-11 9 views

risposta

49

Si può sostenere che SQLite non supporta i dati tipi affatto. In SQLite3, puoi farlo, per esempio.

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

SQLite creerà felicemente una colonna con il "tipo di dati" wibblewibble. SQLite creerà anche felicemente colonne con i "tipi di dati" uuid, guid e SuperChicken.

Il punto cruciale per voi è probabilmente come generare automaticamente un UID. SQLite non può aiutarti molto lì.

Puoi lasciarlo interamente al programma client. Se stai programmando in python, usa uuid module. In ruby, hai il SecureRandom.uuid function. Altre lingue hanno caratteristiche simili o soluzioni alternative.

È possibile scrivere la propria funzione di generazione di UID in C. (Vedere Create or Redefine SQL Functions). Definirei questo un approccio relativamente estremo.

È possibile memorizzarlo nel formato binary o text.


Altre conversazioni online suggeriscono che c'è una diffusa incomprensione su ciò che un UUID è. Un UUID non è semplicemente un numero casuale a 128 bit. Un UUID ha struttura e regole. Vedi RFC 4122.

+1

grazie per il vostro aiuto. Ho generato UUID per un'applicazione Android come questa String sUUiDValue = UUID.randomUUID(). ToString(); e quindi inserito nella tabella ... – amy

3

bisogno di questo per un progetto di risposta di

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

Sfortunatamente, questo produce UUID malformati, ad esempio: 284e630-2293-bea6-21b1095ac11fe4f04. Dovrebbe avere 8 caratteri nel primo gruppo, un terzo gruppo di 4 e 12 caratteri nell'ultimo. Inoltre, i bit della versione UUID dovrebbero essere 4, non casuali. –

15

Benjamin Berry non è giusto — produce UUID malformati — ma mostra una tecnica interessante con una selezione secondaria per generare casualità poi sottostringhe selezione da questo. Ecco qualcosa di simile che ho confermato funziona:

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); 

Un esempio di output:

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

Per me ha creato 20 stessi uguali uguali per la mia copia di migrazione da una tabella a un'altra (dove ho cambiato _id da int a questo uuid) – miroslavign

+1

Come @miroslavign, se utilizzato all'interno di una richiesta per aggiornare tutti i record della tabella, ad esempio, genera l'esatto stesso uido da registrare. – fharreau

5

Ecco qualcosa di simile che può essere utilizzato direttamente come espressione:

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))) 

per esempio da passare come valore predefinito per la colonna:

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 
Problemi correlati