39

次のようなテーブルを作成しています。

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

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

4

5 に答える 5

66

SQLite はデータ型をまったくサポートしていないと主張できます。たとえば、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 関数の作成または再定義」を参照してください)。私はこれを比較的極端なアプローチと呼んでいます。

バイナリ形式またはテキスト形式で保存できます。


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

于 2012-04-11T11:57:38.417 に答える
24

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
于 2014-03-29T01:05:30.847 に答える
2

プロジェクトのためにこれが必要でした

select SUBSTR(UUID, 0, 8)||'-'||SUBSTR(UUID,8,4)||'-'||SUBSTR(UUID,12,4)||'-'||SUBSTR(UUID,16)
from (
select lower(hex(randomblob(16))) AS UUID 
);
于 2014-02-18T23:34:26.590 に答える
-1

ユーザー定義関数を作成しました (C# アプリケーションで guid/uuid 列の既定値を生成するため)

var connection = new SqliteConnection("DataSource=:memory:");
connection.CreateFunction("newid", Guid.NewGuid); 
于 2020-09-09T09:10:16.347 に答える