Det låter som att du kanske vill ha ett par slumpmässigt valda ord från en ordbok . Det är lite svårt att säga med tanke på frågans otydlighet.
Slumpmässiga ORDBOK
Det bästa sättet att välja slumpmässiga ordboksord är förmodligen i PHP-änden genom att använda en lösenfrasgenerator som gör det åt dig.
Du kan göra det i PostgreSQL med hjälp av en tabell dictionary
med ett word
per rad dock:
SELECT word FROM dictionary ORDER BY random() LIMIT 2;
Prestanda kommer att bli riktigt hemskt med en stor ordbok. Det kan göras mycket snabbare om ordboken inte ändras och det finns ett unikt word_id
utan luckor i numreringen, så att du kan skriva:
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();
mot ett bord som detta:
CREATE TABLE dictionary(word_id serial primary key, word text UNIQUE NOT NULL);
Detta ger bara konsekventa resultat om det inte finns några luckor i ordnumreringen och om word_id
är unik eller den PRIMARY KEY
. Det kan producera samma ord två gånger. Om du vill undvika det behöver du en rekursiv CTE eller någon PL/PgSQL.
Slumpmässigt slumpmässigt
Om du faktiskt vill ha riktigt slumpmässiga strängar, är det redan väl täckt här på Stack Overflow. Se Hur skapar du en slumpmässig sträng som är lämplig för ett sessions-ID i PostgreSQL? bland andra; titta på denna sökning .
För att säkerställa unikhet, lägg bara till en UNIQUE
begränsning. Låt din applikation testa för att se om en unik_överträdelse uppstod när du INSERT
ed raden och infoga den med ett nytt slumpmässigt ID om en överträdelse inträffade. Om du vill kan du automatisera detta med en PL/PgSQL-hjälpprocedur, även om det fortfarande kommer att vara föremål för tävlingar mellan samtidiga insättningar i olika transaktioner.