Sembra che tu possa volere un paio di parole selezionate casualmente da un dizionario . È un po' difficile da dire data la mancanza di chiarezza della domanda.
PAROLE DEL DIZIONARIO A CASO
Il modo migliore per scegliere le parole del dizionario casuali è probabilmente all'estremità PHP utilizzando un generatore di passphrase che lo fa per te.
Puoi farlo in PostgreSQL usando una tabella dictionary
con una word
per riga, però:
SELECT word FROM dictionary ORDER BY random() LIMIT 2;
Le prestazioni saranno davvero orribili con un dizionario di grandi dimensioni. Può essere fatto molto più velocemente se il dizionario non cambia e c'è un word_id
univoco senza lacune nella numerazione, permettendoti di scrivere:
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();
contro un tavolo come questo:
CREATE TABLE dictionary(word_id serial primary key, word text UNIQUE NOT NULL);
Questo produrrà risultati coerenti solo se non ci sono lacune nella numerazione delle parole e se word_id
è univoco o la PRIMARY KEY
. può produrre la stessa parola due volte. Se vuoi evitarlo avrai bisogno di un CTE ricorsivo o di qualche PL/PgSQL.
GIBBERA CASUALE
Se in realtà vuoi stringhe veramente casuali, questo è già ben trattato qui su Stack Overflow. Vedi Come si crea una stringa casuale stringa adatta per un ID sessione in PostgreSQL? tra gli altri; guarda questa ricerca .
Per garantire l'unicità, basta aggiungere un UNIQUE
vincolo. Fai testare la tua applicazione per vedere se è stata sollevata una unique_violation quando INSERT
modificare la riga e inserirla con un nuovo ID casuale se si è verificata una violazione. Se lo desideri, puoi automatizzarlo con una procedura di supporto PL/PgSQL, anche se sarà comunque soggetto a gare tra inserimenti simultanei in transazioni diverse.