Help with SQL

Поиск
Список
Период
Сортировка
От anand086
Тема Help with SQL
Дата
Msg-id 1527468155333-0.post@n3.nabble.com
обсуждение исходный текст
Ответы Re: Help with SQL  (Rob Sargent <robjsargent@gmail.com>)
Список pgsql-general
Hi,

I have a requirement of writing plpgsql function to create partial indexes
on child tables if it exists on parent table. The function will have
schemname, childtablename, tableowner as input.

I am using the below code to identify the indexname and index definition
from parent table --

```
with idx as 
                    (select indexrelid::regclass indexname, indisunique,
indisprimary from pg_index where indrelid in 
                        (select oid from pg_class where relname in (select
tablename from pg_indexes where tablename='test_booking')
                        ) 
                       and indpred is not null
                    ) 
        select idxs.tablename, idxs.indexname, idxs.indexdef,
idx.indisunique from pg_indexes as idxs join idx on
idxs.indexname=split_part(idx.indexname::text , '.' ,2)
```

Suppose the indexdef is on parent table is --

CREATE UNIQUE INDEX uniq_test_booking_1 ON demo.test_booking USING btree
(col1,col2 ,col3, col4,col5, col6) WHERE ((col4 IS NOT NULL) AND (col6 IS
NOT NULL))

Now, what I am trying to achieve is to create and execute the below sql,
wherein I replace the  indexname with uniq_<child_table_name>_<randomtext>
and tablename with the childtablename part of function input.

CREATE UNIQUE INDEX uniq_test_booking_20180527_gdhsd ON
demo.test_booking_20180527 USING btree (col1,col2 ,col3, col4,col5, col6)
WHERE ((col4 IS NOT NULL) AND (col6 IS NOT NULL))

Using substring I am trying to break the SQL statement in 2 and then later
concatenate it.
The first part is substring(idxrec.indexdef from 0 for 21);  --> output is
"create unique index " statement.
and for the 2nd part, starting for USING until the end. But I am unable to
get the 2nd part of sql.


```
        if idxrec.indisunique='t' then
            SELECT substr(concat(md5(random()::text), md5(random()::text)), 0,
7) into var;
            idxname:='uniq_'||idxrec.tablename||'_'||var;
            raise notice 'Index name will be %', idxname;
            createStmts1:=substring(idxrec.indexdef from 0 for 21);  --> gives me
the "create unique index"
            raise notice 'String1 %', createStmts1;
            createStmts2:=
            raise notice 'String2 %', createStmts2;
```

Is this the correct way? Any better suggestion? 

How can I achieve this?




--
Sent from: http://www.postgresql-archive.org/PostgreSQL-general-f1843780.html


В списке pgsql-general по дате отправления:

Предыдущее
От: Erwin Brandstetter
Дата:
Сообщение: How to reply to an existing bug?
Следующее
От: Rob Sargent
Дата:
Сообщение: Re: Help with SQL