如何在循环中反映更新?

How to reflect updates in a loop?

我有一个迁移 运行。在每次迭代中,我可以更新几行。但是我怎样才能跳过已经更新的行呢?循环内部的变化对外部是不可见的(是的,我知道 - 稳定的结果) - 但我该如何改变呢?我想,如果一个人已经有了 graph_id --> 跳过

DROP TABLE IF EXISTS persons_2_persons, persons, graph;

CREATE TABLE graph (id SERIAL PRIMARY KEY);
CREATE TABLE persons (id SERIAL PRIMARY KEY, graph_id INTEGER REFERENCES graph(id));
CREATE TABLE persons_2_persons("from" INTEGER NOT NULL REFERENCES persons(id), "to" INTEGER NOT NULL REFERENCES persons(id));

INSERT INTO persons (graph_id) VALUES (NULL), (NULL), (NULL);

INSERT INTO persons_2_persons VALUES
(1,2),(2,1),
(2,3),(3,2);

-- Table has about 18 Mio records. 30-40 persons are connected --> goal: give each graph/cluster an graph_id
-- I also tried with CURSORs

DO $x$
DECLARE  
  var_record RECORD;
  var_graph_id INTEGER;
BEGIN
    
    FOR var_record IN SELECT * FROM persons -- Reevaluate after each iteration
    LOOP
        IF var_record.graph_id IS NULL THEN -- this should be false at the 2nd and 3nd iteration because we updated the data in 1st iteration
          INSERT INTO graph DEFAULT VALUES RETURNING id INTO var_graph_id;
          RAISE NOTICE '%', var_graph_id;
        
          UPDATE persons SET graph_id = var_graph_id WHERE id IN (1,2,3); -- (1,2,3) is found by a RECURESIVE CTE. This are normally 30-40 persons
         
        END IF;
    END LOOP;
END;
$x$;

SELECT * FROM persons;

使循环中的第一个命令刷新该个人记录:

select * from persons into var_record where id=var_record.id;