我不会在 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
类。其他语言以各种名称具有类似的功能。
在数据库中执行此操作的一种方法是使用本地临时表。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;