我想更新自己的行计数表 是在数据库中创建的,其中包含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');
任何人都可以帮助我
答案 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
之后,这个数字就更准确了。