2017-04-15 68 views
0

我有表categories與列category_idname。我想用隨機數據生成新表products。表products有列product_id, category_id, name, price。我想給每個產品隨機category_id生成新表時從表中獲取隨機行

我的表products生成腳本:

INSERT INTO products (category_id, name, price) 
SELECT 
    (SELECT category_id FROM categories OFFSET floor(random()*50) LIMIT 1), 
    ('Product ' || i), 
    round(cast(random() * 999 + 1 as numeric), 2) 
FROM generate_series(1,100) as seq(i) 

這個腳本生成100行的產品,但每個產品都有相同的category_id。我做錯了什麼?

回答

1

「問題」在於Postgres對於優化太積極。它能夠識別子查詢可能只被調用一次 - 不知何故忽略了random()不是確定性函數這一事實。來解決這個

一種方法涉及一個相關子查詢:

SELECT (SELECT category_id 
     FROM categories c 
     WHERE c.category_id <> seq.i 
     OFFSET floor(random()*3) 
     LIMIT 1 
     ), 
     ('Product ' || i), 
     round(cast(random() * 999 + 1 as numeric), 2) 
FROM generate_series(1,100) as seq(i);