sql >> Databasteknik >  >> RDS >> PostgreSQL

Namnge varje rad i tabellen med en slumpmässig tvåordssträng

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.



  1. MariaDB JSON_LENGTH() Förklarad

  2. Postgres FEL:kunde inte öppna filen för läsning:Tillstånd nekad

  3. Hjälp mig med min SQL-fråga (behöver alltid returnera minst en rad.)

  4. Finns det ett snabbt sätt att kontrollera om NÅGON kolumn är NULL?