Wygląda na to, że potrzebujesz pary losowo wybranych słów ze słownika . Trudno powiedzieć, biorąc pod uwagę brak jasności pytania.
losowe słowa ze słownika
Najlepszym sposobem na wybranie losowych słów ze słownika jest prawdopodobnie na końcu PHP za pomocą generatora haseł, który zrobi to za Ciebie.
Możesz to zrobić w PostgreSQL za pomocą tabeli dictionary
z jednym word
za wiersz, ale:
SELECT word FROM dictionary ORDER BY random() LIMIT 2;
Wydajność będzie naprawdę okropna z dużym słownikiem. Można to zrobić znacznie szybciej, jeśli słownik się nie zmienia i istnieje unikalny word_id
bez przerw w numeracji, co pozwala na pisanie:
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();
przy takim stole:
CREATE TABLE dictionary(word_id serial primary key, word text UNIQUE NOT NULL);
Daje to spójne wyniki tylko wtedy, gdy nie ma przerw w numeracji słów i jeśli word_id
jest unikalny lub PRIMARY KEY
. może wyprodukuj to samo słowo dwa razy. Jeśli chcesz tego uniknąć, będziesz potrzebować rekurencyjnego CTE lub jakiegoś PL/PgSQL.
losowy bełkot
Jeśli naprawdę chcesz naprawdę losowych ciągów, jest to już dobrze omówione tutaj na Stack Overflow. Zobacz Jak utworzyć losowy ciąg odpowiedni dla identyfikatora sesji w PostgreSQL? pośród innych; spójrz na to wyszukiwanie .
Aby zapewnić niepowtarzalność, po prostu dodaj UNIQUE
ograniczenie. Przetestuj swoją aplikację, aby sprawdzić, czy podczas INSERT
zostało zgłoszone unikatowe_naruszenie ed wiersz i wstaw go z nowym losowym identyfikatorem, jeśli wystąpiło naruszenie. Jeśli chcesz, możesz to zautomatyzować za pomocą procedury pomocniczej PL/PgSQL, chociaż nadal będzie to podlegać wyścigom między równoczesnymi wstawkami w różnych transakcjach.