1

Temat: relkind - pobranie nazwy tabeli + sequence

Witam,

Mam zapytanie listujące tabele w bazie :

Select relname as tablename from pg_class where relkind in ('r') and relname not like 'pg_%' and relname not like 'sql_%' order by tablename;

Jak zrobić aby pobrało mi jednocześnie nazwę sequence dla danej tabeli? W manualu jest, że wystarczy zmienić 'r' na 'S' ale nie wychodzi mi to w jednym zapytaniu.
Będę jeszcze potrzebował wartość nextval('tabela_id_seq').

2

Odp: relkind - pobranie nazwy tabeli + sequence

to chyba powinno być tak - działa na wersji 9 postgresql

select n.nspname as schema_name,c.relname as table_name
         ,col.attname column_name
         ,substring(atr.adsrc from '%nextval_''#"%#"''%' for '#') as seq_name
from pg_class c
join pg_attribute col on c.oid=col.attrelid and col.atttypid != 0::oid
left join pg_namespace n ON n.oid = c.relnamespace
left join pg_attrdef atr on c.oid=atr.adrelid and col.attnum=atr.adnum
where col.attnum>0 and relkind in('r') and c.oid not in (select relid from pg_statio_sys_tables)
order by n.nspname,c.relname,col.attnum

3

Odp: relkind - pobranie nazwy tabeli + sequence

Tak działa (przed column_name brakowało as).
Nie potrzebnie pobierało kolumny i ograniczyłem to do jednego schematu:

select n.nspname as schema_name,c.relname as table_name

         ,substring(atr.adsrc from '%nextval_''#"%#"''%' for '#') as seq_name
from pg_class c

left join pg_namespace n ON n.oid = c.relnamespace
left join pg_attrdef atr on c.oid=atr.adrelid 
where n.nspname='mg' and relkind in('r') and c.oid not in (select relid from pg_statio_sys_tables)
order by n.nspname, c.relname

Potrzebuję jeszcze pobrać bieżącą wartość sekwencji dla każdej tabeli w tym samym zapytaniu - szukałem w tabelach pg ale nie znalazłem.

4

Odp: relkind - pobranie nazwy tabeli + sequence

5

Odp: relkind - pobranie nazwy tabeli + sequence

ja potrzebuję tą wartość przy listowaniu tabel.

6

Odp: relkind - pobranie nazwy tabeli + sequence

u mnie działa to tak jak w poniższym zapytaniu - jeśli nie ci działała funkcja currval użyj nextval
select n.nspname as schema_name,c.relname as table_name
         ,col.attname as column_name
         ,substring(atr.adsrc from '%nextval_''#"%#"''%' for '#') as seq_name
         ,case when length(substring(atr.adsrc from '%nextval_''#"%#"''%' for '#'))!=0 then currval(substring(atr.adsrc from '%nextval_''#"%#"''%' for '#')) else null end as seq_value
from pg_class c
join pg_attribute col on c.oid=col.attrelid and col.atttypid != 0::oid
left join pg_namespace n ON n.oid = c.relnamespace
left join pg_attrdef atr on c.oid=atr.adrelid and col.attnum=atr.adnum
where col.attnum>0 and relkind in('r') and c.oid not in (select relid from pg_statio_sys_tables)
order by n.nspname,c.relname,col.attnum

Ostatnio edytowany przez c_michal (2012-06-26 08:16:38)

7

Odp: relkind - pobranie nazwy tabeli + sequence

Witam
Może to śmieszne pytanie, ale czy może mi ktoś podpowiedzieć gdzie znajdę rozszyfrowanie tego
atr.adsrc from '%nextval_''#"%#"''%' for '#'

Nie jest mi to potrzebne, ale chciałbym wiedzieć o co chodzi w tej "chińszczyźnie"

Z góry dzięki za odpowiedź
AdamP.

8

Odp: relkind - pobranie nazwy tabeli + sequence

Ostatnio edytowany przez c_michal (2012-06-27 08:57:58)