PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Nommer chaque ligne du tableau avec une chaîne aléatoire de 2 mots

Il semble que vous souhaitiez une paire de mots sélectionnés au hasard à partir d'un dictionnaire . C'est un peu difficile à dire étant donné le manque de clarté de la question.

MOTS ALÉATOIRES DU DICTIONNAIRE

La meilleure façon de choisir des mots de dictionnaire aléatoires est probablement à la fin de PHP en utilisant un générateur de phrase de passe qui le fait pour vous.

Vous pouvez le faire dans PostgreSQL en utilisant une table dictionary avec un word par ligne, cependant :

SELECT word FROM dictionary ORDER BY random() LIMIT 2;

Les performances seront vraiment horribles avec un grand dictionnaire. Cela peut être fait beaucoup plus rapidement si le dictionnaire ne change pas et qu'il existe un word_id unique sans espace dans la numérotation, vous permettant d'écrire :

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();

contre une table comme celle-ci :

CREATE TABLE dictionary(word_id serial primary key, word text UNIQUE NOT NULL);

Cela ne produira des résultats cohérents que s'il n'y a pas d'espace dans la numérotation des mots et si word_id est unique ou la PRIMARY KEY . Il peut produire deux fois le même mot. Si vous voulez éviter cela, vous aurez besoin d'un CTE récursif ou de PL/PgSQL.

Charabia aléatoire

Si vous voulez vraiment des chaînes vraiment aléatoires, c'est déjà bien couvert ici sur Stack Overflow. Voir Comment créer un aléatoire chaîne appropriée pour un ID de session dans PostgreSQL ? entre autres; regardez cette recherche .

Pour garantir l'unicité, ajoutez simplement un UNIQUE contrainte. Faites tester votre application pour voir si une unique_violation a été déclenchée lorsque vous INSERT ed la ligne et insérez-la avec un nouvel ID aléatoire si une violation s'est produite. Si vous le souhaitez, vous pouvez automatiser cela avec une procédure d'assistance PL/PgSQL, bien qu'elle soit toujours sujette à des courses entre les insertions simultanées dans différentes transactions.