sql >> Databáze >  >> RDS >> PostgreSQL

Pojmenování každého řádku v tabulce náhodným 2 slovním řetězcem

Zní to, jako byste mohli chtít pár náhodně vybraných slov ze slovníku . Je to trochu těžké říct, vzhledem k nejasnosti otázky.

NÁHODNÁ SLOVNÍKOVÁ SLOVA

Nejlepší způsob, jak vybrat náhodná slova ze slovníku, je pravděpodobně na konci PHP pomocí generátoru přístupových frází, který to udělá za vás.

Můžete to udělat v PostgreSQL pomocí tabulky dictionary jedním word na řádek, ačkoli:

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

Výkon bude s velkým slovníkem opravdu příšerný. Lze to udělat mnohem rychleji, pokud se slovník nezmění a bude tam jedinečné word_id bez mezer v číslování, což vám umožní psát:

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

proti tabulce jako je tato:

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

Výsledkem budou konzistentní výsledky pouze v případě, že v číslování slov nebudou žádné mezery a pokud word_id je jedinečný nebo PRIMARY KEY . může vytvořit stejné slovo dvakrát. Pokud se tomu chcete vyhnout, budete potřebovat rekurzivní CTE nebo nějaký PL/PgSQL.

NÁHODNÉ BÝVÁNÍ

Pokud skutečně chcete skutečně náhodné řetězce, je to již dobře popsáno zde na Stack Overflow. Viz Jak vytvoříte náhodný řetězec, který je vhodný pro ID relace v PostgreSQL? mezi ostatními; podívejte se na toto vyhledávání .

Pro zajištění jedinečnosti stačí přidat UNIQUE omezení. Nechte svou aplikaci otestovat a zjistěte, zda při INSERT došlo k upozornění na unique_violation Pokud došlo k porušení, řádek upravte a vložte jej s novým náhodným ID. Pokud chcete, můžete to automatizovat pomocí pomocné procedury PL/PgSQL, i když to bude stále podléhat závodům mezi souběžnými vkládáními v různých transakcích.



  1. Synchronizace velké lokální databáze se serverovou DB (MySQL)

  2. Skryjte příkazy SQL> v souboru pro souběžný tisk

  3. Nelze získat json z mysql varchar, ale int

  4. Nelze naplnit fond (není k dispozici žádný vyrovnávací prostor)