Изглежда, че може да искате двойка произволно избрани думи от речник . Трудно е да се каже предвид липсата на яснота на въпроса.
СЛУЧАЙНИ ДУМИ В РЕЧНИКА
Най-добрият начин да изберете произволни думи от речника вероятно е в края на PHP, като използвате генератор на пароли, който го прави вместо вас.
Можете да го направите в PostgreSQL, като използвате dictionary
на таблица с една 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
. Може създайте една и съща дума два пъти. Ако искате да избегнете това, ще ви трябва рекурсивен CTE или някакъв PL/PgSQL.
СЛУЧАЙНИ БЪЛЗОРИЯ
Ако наистина искате наистина произволни низове, това вече е добре разгледано тук в Stack Overflow. Вижте Как се създава произволен низ, който е подходящ за идентификатор на сесия в PostgreSQL? между другото; погледнете това търсене .
За да осигурите уникалност, просто добавете UNIQUE
ограничение. Тествайте приложението си, за да видите дали при INSERT
е повдигнато unique_violation редирайте реда и го вмъкнете с нов произволен идентификатор, ако възникне нарушение. Ако желаете, можете да автоматизирате това с помощта на PL/PgSQL помощна процедура, въпреки че все още ще бъде обект на състезания между едновременни вмъквания в различни транзакции.