Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/35: Рейтинг темы: голосов - 35, средняя оценка - 4.74
8 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 30

Запрос по внешним ключам

03.07.2013, 13:17. Показов 6807. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, я новичок в postgresql, пара дней от роду, помогите чем сможете.

Основная задача такая:
Нужно построить древовидную модель на основе внешних ключей (foreign key) из PostgreSQL.
Суть такова: в комбобоксе выбирается таблица, поля которой будут являться корнем дерева, если у поля имеется внешний ключ, то по этому ключу создаём детей которые будут состоять из полей таблицы на которую ссылается ключ.

А вопрос в следующем:
Какой составить запрос для выдергивания полей из таблиц? И как определить есть ли у поля внешний ключ?

Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2013, 13:17
Ответы с готовыми решениями:

Индекс по внешним ключам!?
Добрый день! Подскажите пожалуйста, он автоматически создаётся при создании внешнего ключа или нет.

Поиск по внешним ключам
Доброго времени суток. Возникла проблема осуществления поиска по внешним ключам таблиц. Сами таблицы приведены ниже: В трех первых...

Связать таблицы по внешним ключам
Имеется база данных структурой: create database Models use Models create table Компания ( ID_Компании int NOT NULL...

3
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
03.07.2013, 16:00
Цитата Сообщение от Alexorleon Посмотреть сообщение
Основная задача такая:
Нужно построить древовидную модель на основе внешних ключей (foreign key) из PostgreSQL.
Может вы не очень правильно поняли задание? Хранить деревья в таблицах - это нормальное явление. Но точно ли такая должна быть реализация как вы написали? Странно выглядит.

Цитата Сообщение от Alexorleon Посмотреть сообщение
А вопрос в следующем:
Какой составить запрос для выдергивания полей из таблиц? И как определить есть ли у поля внешний ключ?
Смотрите запросы к следующим представлениям: information_schema.colums, information_schema.referential_constrain ts, table_constraints.

Только надо сверяться с документацией к соответствующей версии PostgreSQL. Данная информационная схема постоянно пополняется, я точно не знаю в какой версии какие представления появились и имеются.
Документация: здесь
1
8 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 30
09.07.2013, 07:33  [ТС]
Цитата Сообщение от grgdvo Посмотреть сообщение
Может вы не очень правильно поняли задание? Хранить деревья в таблицах - это нормальное явление. Но точно ли такая должна быть реализация как вы написали? Странно выглядит.
Вот более локальный вопрос.
Мне нужно определить есть ли внешний ключ в выбранной таблице, если есть перейти по нему и изъять имена полей.
На сайте http://citforum.ru/database/in... e_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';";

Добавлено через 18 часов 18 минут
Цитата Сообщение от 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_CONSTRAIN TS 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

Добавлено через 2 часа 28 минут
Цитата Сообщение от 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_CONSTRAIN TS 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'
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
09.07.2013, 16:11
Цитата Сообщение от Alexorleon Посмотреть сообщение
Чтож, диалог с самим собой тоже помогает =)
Так приходит понимание того, что делаешь.
А за запрос спасибо, при случае и пригодиться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.07.2013, 16:11
Помогаю со студенческими работами здесь

Гарантировать правильную запись по внешним ключам
Ситуация: Есть таблицы tests, questions, answers, passed_test, passed_question_answer. test -> questions - один ко многим ...

INSERT INTO по внешним ключам SQL C# Windows Forms
как создать запрос insert into ,update , чтобы добавить данные в 3 таблицы связанные внешним ключём таблица1 address (Адрес) ...

Создать запрос для выборки данных из таблицы по внешним ключам
Здравствуйте! Помогите написать Sql-запрос для выборки данных. У меня есть три таблицы: Amount_of_substance_stac, Substance_of_stac и...

Поиск по внешним ключам
Помогите пожалуйста. Есть таблица film и actor film id_film name country actor actor id_actor fio

Как написать запрос на таблицы с внешним ключем
Здравствуйте!Пишу программу с базой данных, которая состоит из нескольких таблиц с внешним ключем. Без ключа - запросы получается писать, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru