Det lyder som om du måske vil have et par tilfældigt udvalgte ord fra en ordbog . Det er lidt svært at sige i betragtning af spørgsmålets manglende klarhed.
TILFÆLDIGE ORDBOG ORD
Den bedste måde at vælge tilfældige ordbogsord på er sandsynligvis i PHP-enden ved at bruge en adgangssætningsgenerator, der gør det for dig.
Du kan gøre det i PostgreSQL ved hjælp af en tabel dictionary
med ét word
per række dog:
SELECT word FROM dictionary ORDER BY random() LIMIT 2;
Ydeevnen vil være virkelig forfærdelig med en stor ordbog. Det kan gøres meget hurtigere, hvis ordbogen ikke ændres, og der er et unikt word_id
uden huller i nummereringen, så du kan skrive:
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();
mod et bord som dette:
CREATE TABLE dictionary(word_id serial primary key, word text UNIQUE NOT NULL);
Dette vil kun give ensartede resultater, hvis der ikke er huller i ordnummereringen, og hvis word_id
er unik eller den PRIMARY KEY
. Det kan fremstille det samme ord to gange. Hvis du vil undgå det, skal du bruge en rekursiv CTE eller noget PL/PgSQL.
TILLFÆLDIG GIBBERISH
Hvis du rent faktisk vil have virkelig tilfældige strenge, er det allerede godt dækket her på Stack Overflow. Se Hvordan opretter du en tilfældig streng, der er egnet til et sessions-id i PostgreSQL? blandt andre; se på denne søgning .
For at sikre unikhed skal du blot tilføje en UNIQUE
begrænsning. Få din applikation til at teste for at se, om der blev rejst en unik_overtrædelse, da du INSERT
ed rækken, og indsæt den med et nyt tilfældigt ID, hvis der opstod en overtrædelse. Hvis du vil, kan du automatisere dette med en PL/PgSQL-hjælperprocedure, selvom den stadig vil være genstand for løb mellem samtidige indsættelser i forskellige transaktioner.