2013-06-24 33 views
36

Có thể sử dụng các giá trị UUID làm khóa chính trong SQLite không? Tôi đang tìm kiếm thông tin rất hạn chế về chủ đề, vì vậy tôi không chắc liệu SQLite có hỗ trợ kiểu dữ liệu UUID hay không. Tôi có nên lưu trữ UUID dưới dạng chuỗi không?Sử dụng UUID trong SQLite

Trả lời

20

SQLite cho phép sử dụng bất kỳ data type làm khóa chính.

UUID có thể được lưu trữ dưới dạng chuỗi (có thể đọc được) hoặc dưới dạng BLOB 16 byte (có thể nhanh hơn nếu các bản ghi quá nhỏ mà sự khác biệt quan trọng).

+0

Là một trong những kiểu dữ liệu hiệu quả hơn khác với việc lưu trữ UUID? –

+2

Đối với các độc giả khác ... chuỗi ký tự 36 ký tự có thể đọc được như sau: '988097c8-3f9c-4ecf-9d1d-64701bb9764c' –

+2

UUID BLOB vs TEXT quan trọng kích thước tệp, tuy nhiên, tốc độ chèn và truy vấn là về giống nhau, xem http://stackoverflow.com/a/11337522/254109 – xmedeko

20

Câu trả lời của CL là chính xác nhưng loại váy là vấn đề ở bàn tay. Như đã đề cập, một cột (hoặc nhiều cột) thuộc bất kỳ loại nào có thể được sử dụng làm khóa chính. Vì vậy, bạn có thể lưu trữ UUID ở định dạng chuỗi có thể đọc được, có thể đọc được và làm cho khóa của bảng. Và vì UUID chỉ là một số nguyên 128 bit, bạn cũng có thể lưu trữ các byte của số nguyên là BLOB, mà tôi tưởng tượng sẽ nhanh hơn một chút.

Nhưng để trực tiếp trả lời những gì tôi tin là câu hỏi trong tầm tay, không, SQLite không có bất kỳ tính năng nào hỗ trợ trực tiếp UUID. SQLite sử dụng kiểu khai báo của một cột để xác định cái nào trong năm số nguyên bên dưới là storage classes (số nguyên, thực, văn bản, blob hoặc null) mà nó sẽ sử dụng. Nhưng loại khai báo của cột bị bỏ qua. Vì vậy, không có loại cột hoặc lớp lưu trữ cụ thể UUID. Có vẻ như không có bất kỳ functions nào có sẵn để chuyển đổi thành và từ chuỗi UUID được định dạng. Để nhận được các byte UUID của bạn, bạn sẽ muốn xem những phương thức nào được cung cấp bởi ngôn ngữ mà ứng dụng của bạn được viết. Ví dụ, lớp UUID của Java hoặc NSUUID của Apple.

4

Không chắc về việc sử dụng nó như là lĩnh vực mặc định, nhưng nếu ai đó cần phải tạo ra giá trị duy nhất trong truy vấn sql cách tiếp cận suggested here sau đây có thể được sử dụng:

Các randomblob (N) chức năng trả về một giả N-byte blob chứa -random byte. Nếu N nhỏ hơn 1 thì một blob ngẫu nhiên 1 byte được trả về. Gợi ý: ứng dụng có thể tạo ra định danh duy nhất trên toàn cầu sử dụng chức năng này cùng với hex() và/hoặc thấp hơn() như thế này:

hex(randomblob(16)) 

hoặc

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

UUID không phải là 'randomblob (16)', xem http://stackoverflow.com/a/22725697/254109 Nếu bạn không cần UUID chính xác, thì 'randomblob' là đủ. – xmedeko

+3

Các byte giả ngẫu nhiên là _not_ giống với UUID. – Bill