Russian Qt Forum

Программирование => Базы данных => Тема начата: Alexorleon от Июль 08, 2013, 09:32



Название: [РЕШЕНО]Связь таблиц по выбранному индексу FOREIGN KEY
Отправлено: Alexorleon от Июль 08, 2013, 09:32
Здравствуйте, помогите разобрать запрос, я в postgre и в БД новичок.

Мне нужно определить есть ли внешний ключ в выбранной таблице, если есть перейти по нему и изъять имена полей.
На сайте http://citforum.ru/database/interbase/interbase_03.shtml нашел что-то подобное, но не могу разобрать запрос.

 select rdb$relation_name , rdb$index_name from rdb$indices
 where rdb$index_name
 in (select rdb$foreign_key
 from rdb$indices where rdb$index_name = "RDB$FOREIGN9");

Что подставлять вместо rdb$, что это вообще? Почему в кавычках пишется RDB$FOREIGN9, а не 'FOREIGN KEY' ?

У меня в БД следующие данные:
схема - archive
таблица - blocks_credits, в которой есть внешний ключ ссылающийся на таблицу access_users

Попытался сделать так, но выдает синтаксические ошибки. Как правильно составить запрос?

queryModel = new QSqlQueryModel;
queryModel->setQuery("SELECT relation_name , index_name "
      "FROM indices WHERE index_name IN (SELECT foreign_key FROM indices "
                         "WHERE index_name =  'FOREIGN KEY');");
treeView->setModel(queryModel);

Экспериментировал с запросами, так вроде выводит имена всех внешних ключей в таблицах.
"SELECT constraint_name FROM information_schema.table_constraints WHERE constraint_type = 'FOREIGN KEY';";


Название: Re: Связь таблиц по выбранному индексу FOREIGN KEY
Отправлено: Alexorleon от Июль 09, 2013, 04:02
Экспериментировал с запросами, так вроде выводит имена всех внешних ключей в таблицах.
"SELECT constraint_name FROM information_schema.table_constraints WHERE constraint_type = 'FOREIGN KEY';";

Вот еще похожий запрос, помогите понять что тут происходит. Как применить это к одной конкретной таблице?

select fk.TABLE_NAME,
pk.TABLE_NAME,
c_fk.ORDINAL_POSITION,
c_fk.COLUMN_NAME,
c_pk.COLUMN_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS as fk
JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as rc on
rc.CONSTRAINT_NAME = fk.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS as pk on
pk.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE as c_fk on
c_fk.CONSTRAINT_NAME = fk.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE as c_pk on
c_pk.CONSTRAINT_NAME = pk.CONSTRAINT_NAME and
c_pk.ORDINAL_POSITION = c_fk.ORDINAL_POSITION
where fk.CONSTRAINT_TYPE = 'FOREIGN KEY'
order by c_fk.ORDINAL_POSITION


Название: Re: Связь таблиц по выбранному индексу FOREIGN KEY
Отправлено: Alexorleon от Июль 09, 2013, 06:30
Вот еще похожий запрос, помогите понять что тут происходит. Как применить это к одной конкретной таблице?

select fk.TABLE_NAME,
pk.TABLE_NAME,
c_fk.ORDINAL_POSITION,
c_fk.COLUMN_NAME,
c_pk.COLUMN_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS as fk
JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as rc on
rc.CONSTRAINT_NAME = fk.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS as pk on
pk.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE as c_fk on
c_fk.CONSTRAINT_NAME = fk.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE as c_pk on
c_pk.CONSTRAINT_NAME = pk.CONSTRAINT_NAME and
c_pk.ORDINAL_POSITION = c_fk.ORDINAL_POSITION
where fk.CONSTRAINT_TYPE = 'FOREIGN KEY'
order by c_fk.ORDINAL_POSITION

Чтож, диалог с самим собой тоже помогает =)
Решение нашел, буду рад если кому пригодится. Заменяем where на эту строку.

where fk.table_schema='ваша схема' AND fk.table_name='ваша таблица' AND fk.CONSTRAINT_TYPE = 'FOREIGN KEY'