2013-09-10 5 views
0

я хочу, чтобы обновить строку отсчитывает таблицу из моих собственных, которые создаются в datbase с числом строк каждой таблицы в БД (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

Если вы собираетесь выбрать эти значения из 'pg_class', почему бы вам не использовать представление? – MatheusOl

+0

Можете ли вы дать мне сценарий, я не мог понять, как это работает –

ответ

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, это число точнее.

+0

Matheus, но мне действительно нужно обновить таблицу, которая уже существует я не могу создать представление, потому что приложение использует ту же таблицу –

+0

@SaravanaKumar, как я уже сказал, если ваше приложение выбирает только эту таблицу, вы можете отказаться от таблицы и создать представление с тем же именем, и ваше приложение будет работать как есть. Если ваше приложение обновляет/вставляет/удаляет на нем, то вы не можете этого сделать. – MatheusOl

+0

есть триггеры, которые всегда обновляют таблицу row_counts всякий раз, когда происходит вставка или удаление –

0

relname является процитировали в вашей функции, но вам не нужно EXECUTE в любом случае, это проще сделать:

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

Если вам не нравится $1 и $2 вы можете использовать имена параметров функции, но в этом случае не назовите их так же, как столбцы. См. Declaring Function Parameters в документе.

Также пустое поле DECLARE не требуется.

+0

Я воспроизвел другой скрипт, чтобы получить это, но не помог мне, вы можете исправить скрипт для меня –

+0

Daniel Vérité есть способ, которым я могу выполнить эту операцию –

+0

@SaravanaKumar: не знаю, какую операцию вы имеете в виду. –

Смежные вопросы