2013-06-24 11 views

Odpowiedz

20

SQLite pozwala używać dowolnego data type jako klucza podstawowego.

Identyfikatory UUID można przechowywać jako ciągi znaków (czytelne dla człowieka) lub jako 16-bajtowe obiekty BLOB (które mogą być szybsze, jeśli rekordy są tak małe, że różnica ma znaczenie).

+0

są albo tego rodzaju danych skuteczniejsze niż inne do przechowywania identyfikatorów UUID? –

+2

Dla innych czytników ... odczytywany przez ludzi 36-znakowy ciąg szesnastkowy wygląda następująco: '988097c8-3f9c-4ecf-9d1d-64701bb9764c' –

+2

UUID BLOB vs TEXT ma wpływ na rozmiar pliku, jednak szybkość wstawiania i zapytania dotyczy samo, zobacz http://stackoverflow.com/a/11337522/254109 – xmedeko

20

Odpowiedź CL jest prawidłowa, ale rodzaj spódnic stanowi problem. Jak wspomniano, kolumna (lub wiele kolumn) dowolnego typu może być użyta jako klucz podstawowy. Tak więc możesz przechowywać przechowywać UUID w sformatowanym, czytelny dla człowieka formacie ciąg i sprawiają, że klucz tabeli. A ponieważ UUID jest tylko 128-bitową liczbą całkowitą, można również przechowywać bajty liczby całkowitej jako BLOB, co jak sądzę byłoby nieco szybsze.

Ale, aby bardziej bezpośrednio odpowiedzieć, co uważam za pytanie, nie, SQLite ma , a nie ma żadnych funkcji, które bezpośrednio obsługują UUID. SQLite używa zadeklarowanego typu kolumny, aby określić, który z pięciu podstawowych storage classes (integer, real, text, blob lub null) użyje. Ale deklarowany typ kolumny jest zignorowany. Tak więc nie ma typów kolumn specyficznych dla UUID ani klas przechowywania. Nie wydaje się też, aby dostępna była jakakolwiek konwersja functions na sformatowany ciąg UUID. Aby otrzymać bajty UUID, będziesz chciał zobaczyć, jakie metody są dostępne w języku, w którym napisana jest twoja aplikacja. Przykładowo, klasa Java UUID lub Apple NSUUID.

4

Nie jestem pewien używając go jako domyślnego pola, ale jeśli ktoś potrzebuje wygenerować unikalną wartość w sqlite zapytania następującym podejściu suggested here można stosować:

randomblob funkcja (N) zwraca N-bajtowy blob zawierający pseudo -random bajtów. Jeśli N jest mniejsze niż 1, zwracany jest 1-bajtowy przypadkowy obszar blob. wskazówka: aplikacje mogą generować globalnie unikalne identyfikatory pomocą tego funkcji razem z heksanem() i/lub dolna(), w następujący sposób:

hex(randomblob(16)) 

lub

lower(hex(randomblob(16))) 
+3

UUID nie jest 'randomblob (16)', zobacz http://stackoverflow.com/a/22725697/254109 Jeśli nie potrzebujesz dokładnego UUID, wtedy 'randomblob' jest wystarczające. – xmedeko

+3

Pseudo-losowe bajty są _nie_ takie same jak identyfikator UUID. – Bill

Powiązane problemy