powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как узнать, есть-ли индекс в таблице, зная её имя и имена индексируемых полей?
2 сообщений из 2, страница 1 из 1
Как узнать, есть-ли индекс в таблице, зная её имя и имена индексируемых полей?
    #33329647
ыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Как узнать, есть-ли индекс в таблице, зная её имя и имена индексируемых полей?
    #33331971
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот функция для поиска индекса по полям, включая составные индексы. Порядок полей не учитывается. Делалось на 8.0.2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
create type find_index_result as (indexname text, indexdef text);

CREATE OR REPLACE FUNCTION find_index(_relname text, _fields text[])
  RETURNS setof find_index_result AS $_$
DECLARE
  _rec RECORD;
  _res find_index_result;
  _relid oid;
  _tmp text;
  _f text;
  _field_cnt int;
  _cnt int;
BEGIN

  _field_cnt := array_upper(_fields,  1 );

  for _rec in execute('select '''||_relname||'''::regclass::oid') loop
    _relid := _rec.oid;
  end loop;
  
  for _res in (
    select c.relname,
      pg_get_indexdef(i.indexrelid)
    from pg_index i
      join pg_class c on c.oid=i.indexrelid
    where i.indrelid=_relid
  ) loop

    _tmp := substring(_res.indexdef from '\\((.*)\\)$');
    _cnt :=  0 ;
    for _i in  1 .. 32  loop
      _f := trim(split_part(_tmp, ',', _i));
      exit when _f is null;
      if _f = any (_fields) then
        _cnt := _cnt +  1 ;
        if _cnt = _field_cnt then
          return next _res;
          exit;
        end if;
      end if;
    end loop; --index field

  end loop; --index
  
  return;
END;
$_$ LANGUAGE plpgsql VOLATILE;


----------------------------------------------проверка
create temp table ind (a int, b text, c date);
create index ind_a on ind(a);
create index ind_ab on ind(a,b);
create index ind_abc on ind(a,b,c);
create index ind_cb on ind(c,b);

select * from find_index('ind', '{a}');
 indexname |                     indexdef
-----------+---------------------------------------------------
 ind_abc   | CREATE INDEX ind_abc ON ind USING btree (a, b, c)
 ind_ab    | CREATE INDEX ind_ab ON ind USING btree (a, b)
 ind_a     | CREATE INDEX ind_a ON ind USING btree (a)

select * from find_index('ind', '{a,b}');
 indexname |                     indexdef
-----------+---------------------------------------------------
 ind_abc   | CREATE INDEX ind_abc ON ind USING btree (a, b, c)
 ind_ab    | CREATE INDEX ind_ab ON ind USING btree (a, b)

select * from find_index('ind', '{c,a,b}');
 indexname |                     indexdef
-----------+---------------------------------------------------
 ind_abc   | CREATE INDEX ind_abc ON ind USING btree (a, b, c)

...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как узнать, есть-ли индекс в таблице, зная её имя и имена индексируемых полей?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]