2016-06-02 23 views
3

Ich habe eine TabellePrevent Postgres aus inlining Update subquery

CREATE TABLE author (
    id SERIAL PRIMARY KEY, 
    followers INTEGER[] 
); 
INSERT INTO author (followers) 
     SELECT '{}'::INTEGER[] 
     FROM generate_series(0, 1000); 

ich es mit ids bevölkert und zufällige Follower hinzufügen möchten. Problem entsteht, wenn I

laufe
UPDATE author 
SET followers = (SELECT array_agg(id) 
       FROM author 
       WHERE random() < 0.01); 

Postgres versucht Smart werden soll, und führt die SELECT nur einmal, was zu demselben Wert immer wieder wiederholt werden, und immer wieder. Was ist der richtige Weg, um dies zu erreichen? Ich versuchte mit und UDPATE .. FROM .. aber ohne Erfolg

Antwort

2

Ich glaube, dass Sie eine künstliche Abhängigkeit zwischen der Unterabfrage und der äußeren Abfrage erstellen müssen. Etwas so einfaches wie:

UPDATE Author AS A1 
SET 
    followers = (
      SELECT array_agg(id) 
      FROM Author 
      WHERE 
       A1.author_id = A1.author_id AND 
       random() < 0.01); 

(I bei einem Spaltennamen von author_id erraten, aber jede Spalte sollte funktionieren)

+0

Dank. Scheint unglaublich hacky, aber es hat funktioniert – mgoszcz2

+1

Sie könnten hier mehr lesen: [Problem mit dem Zufallsprinzip() in PostgreSQL Subselect] (http://www.simononsoftware.com/problem-with-random-in-postgresql-subselect/) – blackbishop