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

テーブルの各行にランダムな2語の文字列で名前を付ける

    ランダムに選択された単語のペアが必要なようです。 辞書から 。質問が明確でないことを考えると、わかりにくいです。

    ランダムな辞書の単語

    ランダムな辞書の単語を選択する最良の方法は、おそらくPHPの最後で、パスフレーズジェネレーターを使用して選択することです。

    テーブルdictionaryを使用してPostgreSQLでそれを行うことができます 1つのword ただし、行ごと:

    SELECT word FROM dictionary ORDER BY random() LIMIT 2;
    

    大きな辞書を使用すると、パフォーマンスは本当にひどいものになります。辞書が変更されず、一意のword_idがあれば、はるかに高速に実行できます。 番号付けにギャップがなく、次のように書くことができます:

    CREATE OR REPLACE FUNCTION get_random_word() RETURNS text AS $$
    SELECT word FROM dictionary 
    WHERE word_id = (
      SELECT width_bucket(random(), 0, 1, (SELECT max(word_id) FROM dictionary))
    );
    $$ LANGUAGE sql;
    
    SELECT get_random_word() || ' ' || get_random_word();
    

    このようなテーブルに対して:

    CREATE TABLE dictionary(word_id serial primary key, word text UNIQUE NOT NULL);
    

    これは、単語番号にギャップがなく、word_idの場合にのみ、一貫した結果を生成します。 一意であるか、PRIMARY KEYできます 同じ単語を2回生成します。これを回避したい場合は、再帰CTEまたはPL/PgSQLが必要になります。

    ランダムなジブリッシュ

    実際に本当にランダムな文字列が必要な場合は、StackOverflowですでに十分に説明されています。 ランダムを作成する方法を参照してくださいPostgreSQLのセッションIDに適した文字列? とりわけ; この検索 をご覧ください 。

    一意性を確保するには、UNIQUEを追加するだけです。 制約。 INSERTを実行したときにunique_violationが発生したかどうかを確認するために、アプリケーションをテストしてもらいます 行を編集し、違反が発生した場合は新しいランダムIDを挿入します。必要に応じて、PL / PgSQLヘルパープロシージャを使用してこれを自動化できますが、異なるトランザクションでの同時挿入間の競合が発生する可能性があります。



    1. E_WARNING:STMT_PREPAREパケットの送信中にエラーが発生しました。 PID =*

    2. LaravelOrderByリレーションシップカウント

    3. Mariadb更新ステートメントの実行中にエラーが発生しました

    4. tnsnames.oraファイルのないOracle接続文字列