sql >> Base de Datos >  >> RDS >> PostgreSQL

Nombrar cada fila de la tabla con una cadena aleatoria de 2 palabras

Parece que podrías querer un par de palabras seleccionadas al azar de un diccionario . Es un poco difícil saberlo dada la falta de claridad de la pregunta.

PALABRAS ALEATORIAS DEL DICCIONARIO

La mejor manera de elegir palabras aleatorias del diccionario es probablemente al final de PHP mediante el uso de un generador de frases de contraseña que lo haga por usted.

Puedes hacerlo en PostgreSQL usando una tabla dictionary con una word por fila, sin embargo:

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

El rendimiento será realmente horrible con un diccionario grande. Se puede hacer mucho más rápido si el diccionario no cambia y hay un word_id único sin espacios en la numeración, lo que le permite escribir:

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 una mesa como esta:

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

Esto solo producirá resultados consistentes si no hay espacios en la numeración de palabras y si word_id es único o la PRIMARY KEY . puede producir la misma palabra dos veces. Si quiere evitar eso, necesitará un CTE recursivo o algo de PL/PgSQL.

GALITAS AL AZAR

Si realmente quiere cadenas verdaderamente aleatorias, eso ya está bien cubierto aquí en Stack Overflow. Consulte ¿Cómo se crea una cadena aleatoria? cadena que sea adecuada para una ID de sesión en PostgreSQL? entre otros; mira esta búsqueda .

Para garantizar la exclusividad, simplemente agregue un UNIQUE restricción. Haga que su aplicación pruebe para ver si se generó una infracción única cuando INSERT eliminó la fila e insértela con una nueva ID aleatoria si se produjo una infracción. Si lo desea, puede automatizar esto con un procedimiento de ayuda PL/PgSQL, aunque aún estará sujeto a carreras entre inserciones simultáneas en diferentes transacciones.