web-dev-qa-db-ja.com

SQLiteでUUIDを使用する

[〜#〜] uuid [〜#〜] 値をSQLiteの主キーとして使用できますか?このトピックに関する情報は非常に限られているため、SQLiteがUUIDデータ型をサポートしているかどうかはわかりません。 UUIDを文字列として保存する必要がありますか?

48
Mike Baxter

SQLiteでは、任意の データ型 を主キーとして使用できます。

UUIDは、文字列(人間が読み取れる)または16バイトBLOB(レコードが小さすぎて違いが問題になる場合は高速になる)として保存できます。

25
CL.

CLの答えは正しいが、ある種の問題は目前の問題である。前述のように、任意のタイプの列(または複数の列)を主キーとして使用できます。したがって、couldは、フォーマットされた人間が読み取れる文字列形式でUUIDを保存し、そのテーブルのキーを作成します。また、UUIDは128ビット整数であるため、整数のバイトをBLOBとして保存することもできますが、これは少し高速になると思います。

しかし、私が手元にある質問だと私が信じていることをより直接的に答えるために、いいえ、SQLiteはUUIDを直接サポートする機能を持っていますnotを持っています。 SQLiteはテーブルを作成するときに、列の宣言された型を使用して、基になる5つの ストレージクラス (整数、実数、テキスト、blobまたはnull)のどれを使用するかを決定します。ただし、それ以外の場合、列の宣言された型は無視されます。そのため、UUID固有の列タイプまたはストレージクラスはありません。また、フォーマットされたUUID文字列との間の変換に使用できる functions はないようです。 UUIDのバイトを取得するには、アプリケーションが記述されている言語によって提供されるメソッドを確認する必要があります。たとえば、Javaの [〜#〜] uuid [〜#〜] クラスまたはAppleのメソッド [〜#〜] nsuuid [〜#〜]

26
spaaarky21

デフォルトフィールドとして使用するかどうかはわかりませんが、誰かがsqliteクエリで一意の値を生成する必要がある場合は、アプローチ ここで提案 を使用できます:

randomblob(N)関数は、擬似ランダムバイトを含むNバイトのblobを返します。 Nが1より小さい場合、1バイトのランダムBLOBが返されます。ヒント:アプリケーションは、この関数とhex()および/またはlower()を使用して、次のようにグローバルに一意の識別子を生成できます:

hex(randomblob(16)) 

または

lower(hex(randomblob(16))) 
3
shtolik