PostgreSQLではそのように問題に取り組むことはしません。
ソフトウェアエンジニアリングの観点からは、xとyの間にランダムな整数を生成し、それらの整数の「n」を生成し、結果がセットであることを保証することを分離すると思います。
-- Returns a random integer in the interval [n, m].
-- Not rigorously tested. For rigorous testing, see Knuth, TAOCP vol 2.
CREATE OR REPLACE FUNCTION random_integer(integer, integer)
RETURNS integer AS
$BODY$
select cast(floor(random()*($2 - $1 +1)) + $1 as integer);
$BODY$
LANGUAGE sql VOLATILE
次に、1から1000までの単一のランダムな整数を選択するには、
select random_integer(1, 1000);
1から1000までの100個のランダムな整数を選択するには、
select random_integer(1, 1000)
from generate_series(1,100);
アプリケーションコードまたはデータベースのいずれかで一意性を保証できます。RubyはSet
クラスを実装します。他の言語には、さまざまな名前で同様の機能があります。
データベースでこれを行う1つの方法は、ローカル一時テーブルを使用します。重複の削除を補うために、必要以上の整数を生成する必要性に関するErwinの権利。このコードは20を生成し、挿入された順序で最初の8行を選択します。
create local temp table unique_integers (
id serial primary key,
n integer unique
);
insert into unique_integers (n)
select random_integer(1, 1001) n
from generate_series(1, 20)
on conflict (n) do nothing;
select n
from unique_integers
order by id
fetch first 8 rows only;