SQLite には UUID を生成する処理はないが、関数を使い以下のクエリを実行することによって擬似的な UUID (ver.4) を作ることが出来る。
- ブレースがいらない場合は printf の第一引数を
'%s-%s-%s-%s-%s'
とすること -
lower()
,hex()
,randomblob()
の関数が必要なので、これらが外されている場合は使えない
SELECT printf('{%s-%s-%s-%s-%s}',
lower(hex(randomblob(4))),
lower(hex(randomblob(2))),
lower(hex(randomblob(2))),
lower(hex(randomblob(2))),
lower(hex(randomblob(6))));
-- => {8edfec23-41ea-1da4-2cec-0fe5f857e17c}
生成された UUID は厳密な形式の UUID ではないのであくまでそれっぽい UUID を作りたい場合にのみに実行すること。
これを応用してテーブル作成時に UUID をレコード挿入時に DEFAULT 構文に追加するとレコード挿入時に自動的に UUID を生成してくれる。
CREATE TABLE uuid_test (
uuid char(38) NOT NULL DEFAULT(printf('{%s-%s-%s-%s-%s}', lower(hex(randomblob(4))), lower(hex(randomblob(2))), lower(hex(randomblob(2))), lower(hex(randomblob(2))), lower(hex(randomblob(6))))),
something text NOT NULL
);
これを uuid.sql として保存し、SQLite 上に読み込ませて実行すると以下の通りになる。
sqlite> .read uuid.sql
sqlite> insert into uuid_test (something) values ('foo');
sqlite> insert into uuid_test (something) values ('foo');
sqlite> insert into uuid_test (something) values ('foo');
sqlite> select * from uuid_test;
{30115bbb-559b-a5a8-b385-f5372b5de032}|foo
{21232081-352a-cb09-ae2d-6017d44e2ca7}|foo
{f3117d72-57d4-153f-d945-0a4280ba7f87}|foo
レコード挿入時に uuid カラムに対して擬似的な UUID が生成されていることがわかる。