PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Benennen Sie jede Zeile in der Tabelle mit einer zufälligen Zeichenfolge aus 2 Wörtern

Es hört sich so an, als ob Sie ein paar zufällig ausgewählte Wörter möchten aus einem Wörterbuch . Angesichts der Unklarheit der Frage ist es schwer zu sagen.

ZUFÄLLIGE WÖRTER DES WÖRTERBUCHS

Der beste Weg, zufällige Wörterbuchwörter auszuwählen, ist wahrscheinlich PHP-seitig, indem Sie einen Passphrase-Generator verwenden, der dies für Sie erledigt.

Sie können dies in PostgreSQL mit einem Tabellen-dictionary tun mit einem word pro Zeile, aber:

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

Die Leistung wird mit einem großen Wörterbuch wirklich schrecklich sein. Es geht viel schneller, wenn sich das Wörterbuch nicht ändert und es eine eindeutige word_id gibt ohne Lücken in der Nummerierung, sodass Sie schreiben können:

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

gegen eine Tabelle wie diese:

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

Dies führt nur dann zu konsistenten Ergebnissen, wenn die Wortnummerierung lückenlos ist und word_id eindeutig ist oder der PRIMARY KEY . Es kann zweimal das gleiche Wort produzieren. Wenn Sie das vermeiden wollen, brauchen Sie einen rekursiven CTE oder etwas PL/PgSQL.

Zufälliges Kauderwelsch

Wenn Sie wirklich zufällige Strings wollen, ist das hier auf Stack Overflow bereits gut abgedeckt. Siehe How you create a random Zeichenfolge, die für eine Sitzungs-ID in PostgreSQL geeignet ist? unter anderen; Sehen Sie sich diese Suche an .

Um die Eindeutigkeit zu gewährleisten, fügen Sie einfach einen UNIQUE hinzu Zwang. Lassen Sie Ihre Anwendung testen, um festzustellen, ob beim INSERT ein unique_violation ausgelöst wurde Bearbeiten Sie die Zeile und fügen Sie sie mit einer neuen zufälligen ID ein, wenn eine Verletzung aufgetreten ist. Wenn Sie möchten, können Sie dies mit einer PL/PgSQL-Hilfsprozedur automatisieren, obwohl es immer noch Wettrennen zwischen gleichzeitigen Einfügungen in verschiedene Transaktionen geben wird.