powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как получить имя primary key?
12 сообщений из 12, страница 1 из 1
Как получить имя primary key?
    #32309594
Павел С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, каким образом можно получить имя столбца который является primary key в определённой таблице?
...
Рейтинг: 0 / 0
Как получить имя primary key?
    #32309746
Konrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
\d table
...
Рейтинг: 0 / 0
Как получить имя primary key?
    #32310037
Павел С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это понятно, а из приложения через запрос?
...
Рейтинг: 0 / 0
Как получить имя primary key?
    #32310181
Konrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
psql -E database

Ключ -E заставит postgres выводить все запросы на экран.
И далее:
Код: plaintext
database=#\d table

См. в текст запросов..
...
Рейтинг: 0 / 0
Как получить имя primary key?
    #32310534
Павел С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про директиву -Е весьма интересное упоминание, спасибо.
Но по какому запросу показывается что аттрибут является ключём. По \d ни какого упоминания об этом нет...
...
Рейтинг: 0 / 0
Как получить имя primary key?
    #32311073
Shweik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pg_catalog.pg_index.indisprimary.


А это выресзка из комманды \d! Внимательней надо
SELECT c2.relname,i.indisprimary
--i.indisunique,
--pg_catalog.pg_get_indexdef(i.indexrelid)
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i
WHERE c.oid = '6221100' AND c.oid = i.indrelid AND i.indexrelid = c2.oid
ORDER BY i.indisprimary DESC, i.indisunique DESC, c2.relname;
...
Рейтинг: 0 / 0
Как получить имя primary key?
    #32311310
Павел С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, вполне понимаю ваше негодование и нервный тон... Но я недавно работаю с PostgresSQL и к сожалению не знаю всех нюансов. Если вам не будет сложно, объясните пожалуста подробней. Я не приложу ума, что мне даёт последний предложенный запрос? Как мне получить имя primary key для совершенно определённой таблицы? Какую пользу я могу извлечь из pg_catalog.pg_index.indisprimary?
...
Рейтинг: 0 / 0
Как получить имя primary key?
    #32311477
Konrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как мне получить имя primary key для совершенно определённой таблицы?

Пример.
Имеем таблицу table, где есть первичный ключ table_pkey.

Получить имя primary key, нам поможет следующий запрос (подсмотренный, кстати, с помощью опции psql -E):
Код: plaintext
1.
2.
3.
SELECT c2.relname
FROM pg_class c, pg_class c2, pg_index i
WHERE c.relname = 'table' AND c.oid = i.indrelid AND i.indexrelid = c2.oid
AND i.indisprimary AND i.indisunique ORDER BY c2.relname


В данном запросе имя искомой таблицы описано алиасом c, а имя первичного ключа - алиасом c2. Далее берется oid искомой таблицы (согласно условию c.relname) и находится идентичное вхождение для поля indexrelid (оно, в свою очередь, отражает oid таблицы-"хозяина" ключа):
Код: plaintext
c.oid = i.indrelid AND i.indexrelid = c2.oid

Далее в запросе, думаю, все достаточно очевидно.
Павел, обратите внимание на фрагмент i.indisprimary в этом запросе. Данной конструкцией мы проверям поле indisprimary с булевым типом данных в таблице pg_index на соответствие истине.
...
Рейтинг: 0 / 0
Как получить имя primary key?
    #32311558
Konrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
каким образом можно получить имя столбца который является primary key в определённой таблице?

Если ваш основной вопрос в этом, то немного дополняем предыдущий запрос:

Код: plaintext
1.
2.
3.
4.
5.
SELECT c2.relname, a.attname
FROM pg_class c, pg_class c2, pg_index i, pg_attribute a
WHERE c.relname = 'table' AND c.oid = i.indrelid AND i.indexrelid = c2.oid
AND i.indisprimary AND i.indisunique 
AND a.attrelid=c2.oid
AND a.attnum> 0 ;


Что добавилось? Имя поля, являющегося PK, из системной таблицы pg_attribute. Основное условие - оно должно принадлежать сущности table_pkey ( a.attrelid=c2.oid ), т.е. самому PK.
...
Рейтинг: 0 / 0
Как получить имя primary key?
    #32313357
Павел С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конрад, спасибо за обстоятельное объяснение и терпение проявленное к моему непрофессионализму. Но так у меня ни чего и не получается... :-(

Вот всё по порядку:
1. Создаю таблицу:
CREATE TABLE radcheck (
id SERIAL PRIMARY KEY,
UserName VARCHAR(30) DEFAULT '' NOT NULL,
Attribute VARCHAR(30),
op VARCHAR(2) NOT NULL DEFAULT '==',
Value VARCHAR(40)
);

2. Выполняю запрос:
SELECT c2.relname, a.attname
FROM pg_class c, pg_class c2, pg_index i, pg_attribute a
WHERE c.relname = 'radchecks' AND c.oid = i.indrelid AND i.indexrelid = c2.oid
AND i.indisprimary AND i.indisunique
AND a.attrelid=c2.oid
AND a.attnum>0;

3. Получаю ответ:
relname | attname
---------+---------
(0 rows)

Где ошибка?
...
Рейтинг: 0 / 0
Как получить имя primary key?
    #32313558
Konrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел, это у вас юмор такой? :)

CREATE TABLE radcheck
...
SELECT ... WHERE c.relname = 'radchecks'
...
Рейтинг: 0 / 0
Как получить имя primary key?
    #32313584
Павел С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да уж... как в том анекдоте получилось:
дети у вас хорошие, а всё что вы делаете руками просто отвратительно.
Приношу свои извинения и ещё раз огромное спасибо!
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как получить имя primary key?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]