0

我想用数据库中每个表的行数更新我自己在数据库中创建的行数表(postgres)

所以我正在尝试这样的事情,但它不起作用该功能正在将每行的计数替换为 0

CREATE OR REPLACE FUNCTION "update_row_counts" (reltuples integer, relname text) 
RETURNS "pg_catalog"."void" AS 
    $body$  
      DECLARE 
      BEGIN 
      EXECUTE 'UPDATE row_counts set reltuples=' || reltuples || ' where relname = ''' || relname;  
      END;  
    $body$  LANGUAGE 'plpgsql';

SELECT update_row_counts(reltuples, relname),relname, reltuples  FROM pg_class pg, information_schema.tables i where
pg.relname = i.table_name and relkind='r' and table_schema not in ('pg_catalog', 'information_schema');

谁能帮我

4

2 回答 2

0

除非您稍后要进行一些数学运算并更新此表(或者如果您正在执行某种快照),否则如果您可以简单地创建一个查询视图,我认为这样做没有意义pg_class,例如:

CREATE VIEW row_counts AS
    SELECT relname, reltuples
    FROM pg_class pg, information_schema.tables i
    WHERE pg.relname = i.table_name
        AND relkind='r'
        AND table_schema NOT IN ('pg_catalog', 'information_schema');

顺便说一句,如果您这样做是为了获取表的行数,请注意此结果不准确,这意味着它是表中元组数的近似值,有时可能真的是错误的. 紧接着ANALYZE是这个数字更准确。

于 2013-09-10T12:59:09.727 回答
0

relname在您的函数中被错误引用,但无论如何您都不需要EXECUTE,这样做更简单:

   UPDATE row_counts set reltuples=$1 where relname=$2

如果您不喜欢$1并且$2可以使用函数参数名称,但在这种情况下不要将它们命名为与列相同的名称。请参阅 文档中的声明函数参数

DECLARE也不需要空白部分。

于 2013-09-10T12:08:20.860 回答