web-dev-qa-db-ja.com

GuidをSqliteデータベースの主キーとして使用できますか

SQLITEデータベースの主キーとしてGUIDを使用できますか?可能な場合は、どのデータ型を使用できますか?

34
user2134137

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バイトです。

33
mvp

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

同様のインデックスパフォーマンスでは、人間が読み取れる文字列より小さなバイナリデータサイズ

10
l --marc l