2016-06-02 12 views
3

У меня есть таблицаПредотвращение Postgres из встраивания обновления подзапросов

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

Я заселил ее с идентификаторами и хочу добавить случайные последователь. Проблема возникает, когда я бегу

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

Postgres является пытается быть умным и выполняет SELECT только один раз, в результате чего же значение, которое будет повторяться снова и снова. Каков правильный способ достижения этого? Я пробовал использовать OFFSET 0 и UDPATE .. FROM .., но безрезультатно

ответ

2

Я считаю, что вам нужно создать искусственную зависимость между подзапросом и внешним запросом. Что-то же просто, как:

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

(я угадал имя столбца author_id, но любой столбец должен работать)

+0

Спасибо. Кажется невероятно взломанным, но это сработало – mgoszcz2

+1

. Вы можете прочитать больше здесь: [Проблема со случайным() в подзапросе PostgreSQL] (http://www.simononsoftware.com/problem-with-random-in-postgresql-subselect/) – blackbishop