Russian Qt Forum
Апрель 24, 2024, 00:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Связь таблиц по выбранному индексу FOREIGN KEY  (Прочитано 4343 раз)
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';";
« Последнее редактирование: Июль 09, 2013, 06:31 от Alexorleon » Записан
Alexorleon
Гость
« Ответ #1 : Июль 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
Записан
Alexorleon
Гость
« Ответ #2 : Июль 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'
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.306 секунд. Запросов: 20.