データベース内のテーブルに単純な命名規則を選択したいと思います。
これは、各行にランダムな2語の文字列で名前を付ける必要があることを意味します。
例えば
ID名
1 ROMEL SUMPI
2 BORMI SUIEMOD
等々、、、、、、、、、
これは、各NAME列に一意の名前を付ける必要があることを意味します。
postgreSQLDBを使用するPHPでこれを行うにはどうすればよいですか。
前もって感謝します、、。、、、、
データベース内のテーブルに単純な命名規則を選択したいと思います。
これは、各行にランダムな2語の文字列で名前を付ける必要があることを意味します。
例えば
ID名
1 ROMEL SUMPI
2 BORMI SUIEMOD
等々、、、、、、、、、
これは、各NAME列に一意の名前を付ける必要があることを意味します。
postgreSQLDBを使用するPHPでこれを行うにはどうすればよいですか。
前もって感謝します、、。、、、、
あなたは実際には「任意の」一意の名前を意味していると思います。簡単な方法は次のとおりです。
INSERT INTO tbl (id, name)
SELECT g, 'name'::text || g || ' surname' || g
FROM generate_series(1, 1000) g;
.. 1000 個の異なる名前を生成します - まったくランダムではありませんが、一意です。
AZ から 3 ~ 10 個のランダムな文字を含む 2 つの単語で構成される 100 個の名前を生成するには、次のようにします。
INSERT INTO tbl (id, name)
SELECT g%100
,left(string_agg(chr(65 + (random() * 25)::int), ''), 3 + (random() * 7)::int)
|| ' ' ||
left(string_agg(chr(65 + (random() * 25)::int), ''), 3 + (random() * 7)::int)
FROM generate_series(1, 1000) g
GROUP BY 1
ORDER BY 1;
'A' の ASCII コードは 65 で、'Z' の ASCII コードは 90 です。幸いなことに、その範囲は基本的な大文字アルファベットに及びます。ascii()
関数で調べることができます。これは の逆ですchr()
。
SELECT ascii('A')
2 番目の方法では一意性は保証されませんが、名前が数百個しかない場合、重複する可能性は非常に低くなります。重複の可能性を排除するのは簡単です。SELECT
別のレイヤーを追加してGROUP BY name
、 を選択しmin(id)
ます。
辞書からランダムに選択された単語のペアが必要なようです。質問の明確さの欠如を考えると、わかりにくいです。
ランダムな辞書の単語を選択する最善の方法は、おそらく PHP 側でパスフレーズ ジェネレーターを使用することです。
ただし、1 行にdictionary
1 つのテーブルを使用して PostgreSQL で実行できます。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 が必要になります。
実際に真にランダムな文字列が必要な場合は、ここ Stack Overflow で既に十分に説明されています。PostgreSQL でセッション ID に適したランダムな文字列を作成するにはどうすればよいですか? を参照してください。とりわけ; この検索を見てください。
UNIQUE
一意性を確保するには、制約を追加するだけです。行を編集したときにunique_violationが発生したかどうかをアプリケーションでテストしINSERT
、違反が発生した場合は新しいランダムIDで挿入します。必要に応じて、PL/PgSQL ヘルパー プロシージャを使用してこれを自動化できますが、異なるトランザクションでの同時挿入間の競合は引き続き発生します。