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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте, я новичок в 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
1258 / 973 / 383
Регистрация: 02.09.2012
Сообщений: 3,001
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
1258 / 973 / 383
Регистрация: 02.09.2012
Сообщений: 3,001
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
Ответ Создать тему
Новые блоги и статьи
Максимальная производительность C#: Span<T> и Memory<T>
stackOverflow 22.04.2025
Мир высоконагруженных приложений безжалостен к неэффективному коду. Каждая миллисекунда на счету, каждый выделенный байт памяти может стать причиной падения производительности. Разработчики на C#. . .
JWT аутентификация в Java
Javaican 21.04.2025
JWT (JSON Web Token) представляет собой открытый стандарт (RFC 7519), который определяет компактный и самодостаточный способ передачи информации между сторонами в виде JSON-объекта. Эта информация. . .
Спринты Agile: Планирование, выполнение, ревью и ретроспектива
EggHead 21.04.2025
Спринты — сердцевина Agile-методологии, позволяющая командам создавать работающий продукт итерационно, с постоянной проверкой гипотез и адаптацией к изменениям. В основе концепции спринтов лежит. . .
Очередные открытия мега простых чисел, сделанные добровольцами с помощью домашних компьютеров
Programma_Boinc 21.04.2025
Очередные открытия мега простых чисел, сделанные добровольцами с помощью домашних компьютеров. 3 марта 2025 года, в результате обобщенного поиска простых чисел Ферма в PrimeGrid был найден. . .
Система статов в Unity
GameUnited 20.04.2025
Статы — фундаментальный элемент игрового дизайна, который определяет характеристики персонажей, предметов и других объектов в игровом мире. Будь то показатель силы в RPG, скорость передвижения в. . .
Статические свойства и методы в TypeScript
run.dev 20.04.2025
TypeScript прочно занял своё место в системе современной веб-разработки. Этот строго типизированный язык программирования не просто расширяет возможности JavaScript — он делает разработку более. . .
Batch Transform и Batch Gizmo Drawing API в Unity
GameUnited 20.04.2025
В мире разработки игр и приложений на Unity производительность всегда была критическим фактором успеха. Создатели игр постоянно балансируют между визуальной привлекательностью и плавностью работы. . .
Звук в Unity: Рандомизация с Audio Random Container
GameUnited 20.04.2025
В современных играх звуковое оформление часто становится элементом, который либо полностью погружает игрока в виртуальный мир, либо разрушает атмосферу за считанные минуты. Представьте: вы исследуете. . .
Максимальная производительность C#: Советы, тестирование и заключение
stackOverflow 20.04.2025
Погружение в мир микрооптимизаций C# открывает перед разработчиком целый арсенал мощных техник. Но как определить, где и когда их применять? Ответ начинается с точных измерений и профилирования. . . .
Максимальная производительность C#: Предсказание ветвлений
stackOverflow 20.04.2025
Третий ключевой аспект низкоуровневой оптимизации — предсказание ветвлений. Эта тема менее известна среди разработчиков, но её влияние на производительность может быть колоссальным. Чтобы понять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер