Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在postgres中使用for循环和if语句_Postgresql_Stored Procedures - Fatal编程技术网

Postgresql 在postgres中使用for循环和if语句

Postgresql 在postgres中使用for循环和if语句,postgresql,stored-procedures,Postgresql,Stored Procedures,这怎么不起作用?基本上,这个过程将更新主买家表中的列,以检查用户是否在其他表中有数据 DO language plpgsql $$ DECLARE buyer integer; BEGIN FOR buyer IN SELECT id FROM buyers LOOP IF (SELECT count(*) FROM invoice WHERE buyer_id = buyer) > 0 THEN UPDATE buye

这怎么不起作用?基本上,这个过程将更新主买家表中的列,以检查用户是否在其他表中有数据

DO language plpgsql $$
    DECLARE 
    buyer integer;
    BEGIN
    FOR buyer IN SELECT id FROM buyers
    LOOP
      IF (SELECT count(*) FROM invoice WHERE buyer_id = buyer) > 0 THEN
        UPDATE buyers SET has_invoice = true WHERE id = buyer;
      ELSE
        UPDATE buyers SET has_invoice = false WHERE id = buyer;
      END IF;
    END LOOP;
    RETURN;
    END;
$$;
目前尚不清楚什么是“不起作用”。无论哪种方式,请使用此等效的
UPDATE
语句:

UPDATE buyers b
SET    has_invoice = EXISTS (SELECT 1 id FROM invoice WHERE buyer_id = b.id);
如果不需要冗余存储来提高性能,则可以使用或生成的列来实现相同的目的。然后,
has\u invoice
列将动态计算,并且始终是最新的。此密切相关答案中的说明:

您不需要循环,只需一条update语句就可以完成(效率更高)。此外,如果在另一个连接更新
发票
表时运行此操作,可能会产生错误的结果。您需要考虑并发性,或者使用表锁以便可以忽略它。