PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Nomeando cada linha na tabela com uma string aleatória de 2 palavras


Parece que você pode querer um par de palavras selecionadas aleatoriamente de um dicionário . É meio difícil dizer, dada a falta de clareza da pergunta.

PALAVRAS ALEATÓRIAS DO DICIONÁRIO


A melhor maneira de escolher palavras aleatórias do dicionário é provavelmente no final do PHP, usando um gerador de frase secreta que faz isso para você.

Você pode fazer isso no PostgreSQL usando uma tabela dictionary com uma word por linha, no entanto:
SELECT word FROM dictionary ORDER BY random() LIMIT 2;

O desempenho será realmente terrível com um dicionário grande. Isso pode ser feito muito mais rápido se o dicionário não mudar e houver um word_id exclusivo sem lacunas na numeração, permitindo que você escreva:
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();

contra uma tabela como esta:
CREATE TABLE dictionary(word_id serial primary key, word text UNIQUE NOT NULL);

Isso só produzirá resultados consistentes se não houver lacunas na numeração das palavras e se word_id é único ou a PRIMARY KEY . Ele pode produzir a mesma palavra duas vezes. Se você quiser evitar isso, precisará de um CTE recursivo ou algum PL/PgSQL.

GIBBERING ALEATÓRIO


Se você realmente quer strings verdadeiramente aleatórias, isso já está bem abordado aqui no Stack Overflow. Consulte Como você cria um string adequada para um ID de sessão no PostgreSQL? entre outros; veja esta pesquisa .

Para garantir a exclusividade, basta adicionar um UNIQUE restrição. Faça seu aplicativo testar para ver se uma unique_violation foi gerada quando você INSERT ed a linha e insira-a com um novo ID aleatório se ocorrer uma violação. Se você quiser, pode automatizar isso com um procedimento auxiliar PL/PgSQL, embora ainda esteja sujeito a corridas entre inserções simultâneas em diferentes transações.