更新表中的行计数

时间:2013-09-10 10:56:06

标签: sql postgresql postgresql-9.1

我想更新自己的行计数表 是在数据库中创建的,其中包含db (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');

任何人都可以帮助我

2 个答案:

答案 0 :(得分:0)

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

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

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

此外,不需要空DECLARE部分。

答案 1 :(得分: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之后,这个数字就更准确了。