sql >> データベース >  >> RDS >> PostgreSQL

Postgres 9.6+で長さNのランダムで一意の英数字IDを生成するにはどうすればよいですか?

    これを理解しました、これを行う関数は次のとおりです:

    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 |
    


    1. SQL:複数の列でGROUPBYとMAXを使用する

    2. Oracle SQL Developerでバッファサイズを増やしてすべてのレコードを表示するにはどうすればよいですか?

    3. MySQL変数`max_allowed_pa​​cket`が1MBに自動リセット

    4. HibernateOracle識別子が長すぎますORA-00972