PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Assegnare un nome a ciascuna riga della tabella con una stringa casuale di 2 parole

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.