2013-05-01 28 views
0

所以我有一個類型爲int的表上的數組列。我正在爲一百萬行進行負載測試,並且每個記錄需要四個數組元素,每個元素都有不同的值postgres在數組列中插入隨機數

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

這創建2條記錄,但我需要的數字是唯一的。

+0

順便說一句,從你的表名猜測,這些電話號碼?如果是這樣,你可能不希望將它們存儲爲整數,因爲電話號碼可以具有前導零,這將在整數列中神祕地消失。 (北美以外的地區代碼以0開始與本地號碼區分,00代表國際撥號) – IMSoP 2013-05-01 17:04:09

+0

感謝您的輸入,但這僅僅是一個示例。沒有實際的數據被問到這個問題:) – joncodo 2013-05-01 17:07:08

+0

哈,夠公平的:) – IMSoP 2013-05-01 17:19:53

回答

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超出整數的範圍。所以也許你想要大整數。

+0

看起來不錯。現在測試 – joncodo 2013-05-01 16:51:43

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()返回一個浮點數,你想一個整數,你需要投的地方。寫的最簡單的是整個陣列與::int[]末投,像這樣:

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

Postgres的文檔:random(); array constructors (including note on the casting shortcut)