これを理解しました、これを行う関数は次のとおりです:
CREATE OR REPLACE FUNCTION generate_uid(size INT) RETURNS TEXT AS $$
DECLARE
characters TEXT := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
bytes BYTEA := gen_random_bytes(size);
l INT := length(characters);
i INT := 0;
output TEXT := '';
BEGIN
WHILE i < size LOOP
output := output || substr(characters, get_byte(bytes, i) % l + 1, 1);
i := i + 1;
END LOOP;
RETURN output;
END;
$$ LANGUAGE plpgsql VOLATILE;
そして、それを実行するには、次のようにします。
generate_uid(10)
-- '3Rls4DjWxJ'
警告
これを行うときは、作成するIDの長さが、作成するオブジェクトの数が増えるにつれて時間の経過とともに衝突を回避するのに十分であることを確認する必要があります。これは、誕生日のパラドックス
。 したがって、10
よりも長い(またははるかに長い)長さが必要になる可能性があります。 合理的に一般的に作成されたオブジェクトには、10
を使用しました 簡単な例として。
使用法
関数を定義すると、次のようにテーブル定義で使用できます。
CREATE TABLE collections (
id TEXT PRIMARY KEY DEFAULT generate_uid(10),
name TEXT NOT NULL,
...
);
そして、次のようにデータを挿入するとき:
INSERT INTO collections (name) VALUES ('One');
INSERT INTO collections (name) VALUES ('Two');
INSERT INTO collections (name) VALUES ('Three');
SELECT * FROM collections;
id
が自動的に生成されます 値:
id | name | ...
-----------+--------+-----
owmCAx552Q | ian |
ZIofD6l3X9 | victor |
プレフィックス付きの使用法
または、ログまたはデバッガーで単一のIDを確認するときに便利なプレフィックスを追加することもできます(Stripeのやり方 )、そのように:
CREATE TABLE collections (
id TEXT PRIMARY KEY DEFAULT ('col_' || generate_uid(10)),
name TEXT NOT NULL,
...
);
INSERT INTO collections (name) VALUES ('One');
INSERT INTO collections (name) VALUES ('Two');
INSERT INTO collections (name) VALUES ('Three');
SELECT * FROM collections;
id | name | ...
---------------+--------+-----
col_wABNZRD5Zk | ian |
col_ISzGcTVj8f | victor |