Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

[РЕШЕНО]Связь таблиц по выбранному индексу FOREIGN KEY

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных
Предыдущая тема :: Следующая тема  
Автор Сообщение
Alexorleon



Зарегистрирован: 08.07.2013
Сообщения: 4

СообщениеДобавлено: Пн Июл 08 2013 16:03    Заголовок сообщения: [РЕШЕНО]Связь таблиц по выбранному индексу FOREIGN KEY Ответить с цитатой

Здравствуйте, помогите разобрать запрос, я в 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';";


Последний раз редактировалось: Alexorleon (Вт Июл 09 2013 07:36), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Alexorleon



Зарегистрирован: 08.07.2013
Сообщения: 4

СообщениеДобавлено: Вт Июл 09 2013 05:06    Заголовок сообщения: Re: Связь таблиц по выбранному индексу FOREIGN KEY Ответить с цитатой

Alexorleon писал(а):

Экспериментировал с запросами, так вроде выводит имена всех внешних ключей в таблицах.
"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



Зарегистрирован: 08.07.2013
Сообщения: 4

СообщениеДобавлено: Вт Июл 09 2013 07:35    Заголовок сообщения: Re: Связь таблиц по выбранному индексу FOREIGN KEY Ответить с цитатой

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

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'
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных Часовой пояс: GMT + 4
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...