0

所以我在一个 int 类型的表上有一个数组列。我正在对一百万行进行负载测试,每个记录需要四个数组元素,所有元素都具有不同的值。

INSERT INTO contacts (numbers)
SELECT '{4443331111, 2223334444, 2223339999, 8887779999}'
  FROM generate_series(1,2) AS x(id);

这会创建 2 条记录,但我需要这些数字是唯一的。

4

2 回答 2

4

你需要的是random()函数,乘以一些合适的数字来给出你的最大值;但是您需要从对该函数的四个调用中构造一个数组。

构造数组值的语法略有不同,在这里更容易使用,如下所示:

SELECT ARRAY[4443331111, 2223334444, 2223339999, 8887779999]

由于您不需要将其构建为字符串,因此您可以对数组的各个部分使用函数调用,这意味着这应该可以工作:

SELECT ARRAY[random() * 1000000, random() * 1000000, random() * 1000000, random() * 1000000]
FROM generate_series(1,2) AS x(id);

由于random()返回一个浮点数并且您需要一个整数,因此您需要在某处进行强制转换。最简单的写法是将整个数组以 a::int[]结尾,如下所示:

SELECT ARRAY[random() * 1000000, random() * 1000000, random() * 1000000, random() * 1000000]::int[]
FROM generate_series(1,2) AS x(id);

Postgres 文档:random()数组构造函数(包括关于转换快捷方式的注释)

于 2013-05-01T16:47:21.623 回答
3
INSERT INTO contacts (numbers)
SELECT distinct array[
        (random() * 99999999)::integer,
        (random() * 99999999)::integer,
        (random() * 99999999)::integer,
        (random() * 99999999)::integer
    ]
FROM generate_series(1, 1000000) AS x(id);

请注意,数字 8887779999 超出了整数范围。所以也许你想要大整数。

于 2013-05-01T16:45:40.100 回答