GUID を SQLITE データベースの主キーとして使用することは可能ですか?可能であれば、どのデータ型を使用できますか?
2 に答える
GUID
SQLite 自体は内部型としてサポートしていません。
それを除いて、そうです!(一種)。SQLite では、任意の文字列を型名として使用でき、それにはGUID
orが含まれることを思い出してくださいUUID
( SQLite データ型の詳細を参照してください)。
これらの規則によると、タイプにはフィールドと同じ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 は SQLite のキーとして、TEXT
またはバイナリBLOB
表現として使用できます。
同様の質問への回答で投稿されたパフォーマンス数値に基づいて、バイナリと文字列の両方の UUID は、SQLite で作成およびクエリのインデックス作成時に効率的である可能性があります。
次の表を参照してください: https://stackoverflow.com/a/11337522/3103448
SQLite は、BLOB または TEXT のいずれかの 128 ビット乱数を生成できますrandomblob(16)
。hex(X)
例:lower(hex(randomblob(16)))
同様のインデックス パフォーマンスでは、人間が読める文字列が小さいバイナリ データ サイズよりも優先されるかどうかという重大なトレードオフが生じます。
注: 2020 年 1 月 22 日のSQLite リリース 3.31.0 では 、RFC-4122 UUID を処理するための関数を実装する uuid.c 拡張モジュールが追加されました。
uuid() // generate a version 4 UUID as a string
uuid_str(X) // convert a UUID X into a well-formed UUID string
uuid_blob(X) // convert a UUID X into a 16-byte blob
それ以外の場合、RFC 4122 UUID (ランダム) タイプ 4 に準拠するには、次の手順を実行します。
- ランダムな 16 バイト (=128 ビット) を生成する
次のように、RFC 4122 セクション 4.4 に従って特定のビットを調整します。
を。a. 7 番目のバイトの 4 つの最上位ビットを 0100'B に設定するため、上位ニブルは「4」になります。9 番目のバイトの 2 つの最上位ビットを 10'B に設定すると、上位ニブルは「8」、「9」、「A」、または「B」のいずれかになります。