LoginSignup
7
6

More than 5 years have passed since last update.

SQLite のみで UUID 生成する

Posted at

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 が生成されていることがわかる。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6