2012-04-11 10 views

Trả lời

49

Bạn có thể cho rằng SQLite không hỗ trợ dữ liệu loại. Trong SQLite3, bạn có thể làm điều này, ví dụ.

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

SQLite sẽ vui vẻ tạo cột có "loại dữ liệu" có thể cuộn. SQLite cũng sẽ vui vẻ tạo ra các cột với "kiểu dữ liệu" uuid, guid và SuperChicken.

Điểm quan trọng đối với bạn có lẽ là cách tự động tạo uid. SQLite không thể giúp bạn nhiều ở đó.

Bạn có thể để toàn bộ chương trình khách hàng. Nếu bạn đang lập trình bằng python, hãy sử dụng uuid module. Trong ruby, bạn có SecureRandom.uuid function. Các ngôn ngữ khác có các tính năng hoặc giải pháp tương tự.

Bạn có thể viết hàm tạo uid của riêng bạn trong C. (Xem Create or Redefine SQL Functions.) Tôi gọi đây là một cách tiếp cận tương đối cực đoan.

Bạn có thể lưu trữ ở định dạng binary hoặc text.


cuộc hội thoại khác trực tuyến cho thấy rằng có một sự hiểu lầm phổ biến về những gì một UUID . UUID không chỉ đơn giản là số ngẫu nhiên 128 bit. UUID có cấu trúc và quy tắc. Xem RFC 4122.

+1

cảm ơn sự giúp đỡ của bạn. Tôi đã tạo UUID cho ứng dụng Android như chuỗi này sUUiDValue = UUID.randomUUID(). ToString(); và sau đó chèn vào bảng ... – amy

3

cần thiết này cho một dự án trả lời

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

Thật không may, điều này tạo ra UUID không đúng định dạng, ví dụ: 284e630-2293-bea6-21b1095ac11fe4f04. Nó sẽ có 8 ký tự trong nhóm đầu tiên, một nhóm thứ ba gồm 4 và 12 ký tự cuối cùng. Ngoài ra, các bit phiên bản UUID phải là 4, không phải ngẫu nhiên. –

15

Benjamin Berry là không đúng — nó tạo UUIDs bị thay đổi — nhưng nó cho thấy một kỹ thuật thú vị bằng một subselect để tạo ra ngẫu nhiên sau đó chọn chuỗi con từ đó. Dưới đây là một cái gì đó tương tự mà tôi đã khẳng định không làm việc:

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

Một số lượng mẫu:

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

Đối với tôi, nó tạo ra 20 uuids giống hệt nhau cho bản sao di chuyển của tôi từ bảng này sang bảng khác (nơi tôi thay đổi _id từ int sang uuid này) – miroslavign

+1

Giống như @miroslavign, nếu được sử dụng trong một yêu cầu cập nhật tất cả các bản ghi bảng chẳng hạn các exacts cùng một hồ sơ foru uuid. – fharreau

5

Dưới đây là một cái gì đó tương tự mà có thể được sử dụng trực tiếp dưới dạng cụm từ:

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

cho ví dụ được chuyển làm giá trị mặc định cho cột:

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