web-dev-qa-db-ja.com

SQLITEにUIDデータ型がありますか?はいの場合、その値を生成する方法

私はこのようなテーブルを作成しています:

CREATE TABLE foobar (id uniqueidentifier, foo text, bar text, PRIMARY  KEY (id))

テーブルfoobarのidフィールドの値を挿入または生成する方法は?

31
amy

SQLiteはデータtypesをまったくサポートしていないと主張できます。たとえばSQLite3では、これを行うことができます。

sqlite> create table test (id wibblewibble primary key);

SQLiteは喜んで「データ型」wibblewibbleの列を作成します。 SQLiteは、「データ型」uuid、guid、およびSuperChickenを含む列を楽しく作成します。

あなたにとって重要な点は、おそらくuidを自動的に生成する方法でしょう。 SQLiteはそこではあまり役に立ちません。

完全にクライアントプログラムに任せることができます。 Pythonでプログラミングしている場合は、 uuidモジュール を使用します。 Rubyには SecureRandom.uuid関数 があります。他の言語にも同様の機能または回避策があります。

独自のuid生成関数をCで作成できます( SQL関数の作成または再定義 を参照)。これは比較的極端なアプローチと呼んでいます。

binary または text 形式のいずれかで保存できます。


オンラインでの他の会話は、UUIDが何であるかについて広く誤解されていることを示唆しています。 UUIDは単なる128ビットの乱数ではありません。 UUIDには構造とルールがあります。 RFC 4122 を参照してください。

Benjamin Berryの答えは正しくありません。不正なUUIDが生成されますが、サブセレクトを使用してランダム性を生成し、そこからサブストリングを選択する興味深いテクニックを示しています。これが私が動作することを確認したのと同じようなものです:

select substr(u,1,8)||'-'||substr(u,9,4)||'-4'||substr(u,13,3)||
  '-'||v||substr(u,17,3)||'-'||substr(u,21,12) from (
    select lower(hex(randomblob(16))) as u, substr('89ab',abs(random()) % 4 + 1, 1) as v);

いくつかの出力例:

c71122df-18e4-4a78-a446-fbf7b8f2969b
61e75f87-978b-4d9e-b587-bedcc2d23898
30eee0fa-2ff2-4ff5-b8ef-f99378272999
21
Tim Ruddick

以下は、式として直接使用できる同様のものです。

lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6)))

たとえば、列のデフォルト値として渡されます:

sqlite> create table "table" (
  "id" char(36) default (lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6)))), 
  "data" varchar(255), primary key ("id")
);

sqlite> insert into "table" ("data") values ('foo');
sqlite> insert into "table" ("data") values ('bar');
sqlite> select * from "table";
947efcc9-4212-442a-b68c-eb6fbd8a7128|foo
a2c3857b-1eb4-40bd-aed2-6e8d68cc2ab8|bar
16
Mikael Lepistö

これはプロジェクトに必要でした

select SUBSTR(UUID, 0, 8)||'-'||SUBSTR(UUID,8,4)||'-'||SUBSTR(UUID,12,4)||'-'||SUBSTR(UUID,16)
from (
select lower(hex(randomblob(16))) AS UUID 
);
2
Benjamin Berry