SQLITEデータベースの主キーとしてGUIDを使用できますか?可能な場合は、どのデータ型を使用できますか?
SQLite自体は、GUID
を内部型としてサポートしていません。
それ以外は、そうです! (並べ替え)。 SQLiteでは、任意の文字列を型名として使用でき、それにはGUID
またはUUID
が含まれることを忘れないでください( SQLite datatypes の詳細を参照してください)。
これらのルールによれば、GUID
型にはアフィニティNONE
があり、これはBLOB
フィールドの場合と同じです。これを念頭に置いて、GUID
タイプの列を作成し、次のルールを使用して列にアクセスできます。
_X'01020304050607080910111213141516'
_のような文字列として保存します(X表記は16バイトのBLOB
値を表すために使用されます)。挿入するには、次を使用します。
_INSERT INTO mytable (uuid)
VALUES (X'01020304050607080910111213141516');
_
16バイトBLOB
として読み取ります。 quote(uuid)
は、X表記を使用して出力をフォーマットするために使用できます。
_SELECT quote(uuid)
FROM mytable
_
このような列は、主キーとしても使用できます。残念ながら、整数主キーに存在するようなAUTOINCREMENT機能はありません。自分で処理する必要があります。そのためにrandomblob(16)
のような単純なものを使用できますが、定義されているUUID
ではありません 標準 。
紛らわしいことに、同じフィールドにUUIDのテキスト表現を保存することもできます(SQLiteはそれを止めることはありません)が、少なくとも2倍のスペースが必要です:BLOBは16バイト、テキストとしてのUUIDは少なくとも32バイトです。
_sqlite3
_自体は、ネイティブUUID 128ビット形式ではありません。
ただし、GUIDはTEXT
またはバイナリBLOB
表現としてSQLiteのキーとして使用できます。
同様の質問に答えて投稿されたパフォーマンスの数値に基づいて、バイナリと文字列の両方のUUIDは、SQLite for Create and Querywhen indexedで効率的です。
次の表を参照してください: https://stackoverflow.com/a/11337522/3103448
SQLiteは、BLOBまたはTEXT UUIDを randomblob(16)
および hex(X)
で生成できます。例:lower(hex(randomblob(16)))
同様のインデックスパフォーマンスでは、人間が読み取れる文字列がより小さなバイナリデータサイズ。