2014-01-09 4 views
0

Как определить, установлен ли столбец таблицы внешним ключом и получить имя ссылочной таблицы в Postgres?Внешний ключ PostgreSQL

Мне нужна эта информация для графического интерфейса java. Поэтому SQL-решение - это лучший способ его решения, я действительно не могу его решить.

рассматривает стефановских

пример:

create table SUREALTABLE(
    VNR varchar(5), 
    tnumberone integer, 
    tnumbertwo integer, 
    foreign key (tnumberone ,tnumbertwo) references TESTTABLE(numberone,numbertwo), 
    primary key (VNR) 
); 

create table TESTTABLE(
    numberone integer, 
    numbertwo integer, 
    primary key (numberone, numbertwo) 
); 

ответ

2

Вы можете определить, что с pg_catalog.pg_constraint и pg_catalog.pg_attribute (подробнее here).

select a.confrelid::regclass, 
     b.attname 
from pg_constraint a 
     join pg_attribute b 
     on a.conrelid = b.attrelid 
     and b.attnum = any (a.conkey) 
where a.conrelid = '<tablename>'::regclass 
    and a.contype = 'f' 
; 

Вы можете отфильтровать это, используя b.attname.

Более конкретный пример:

select a.confrelid::regclass 
from pg_constraint a 
     join pg_attribute b 
     on a.conrelid = b.attrelid 
     and b.attnum = any (a.conkey) 
where a.conrelid = 'SUREALTABLE'::regclass 
    and a.contype = 'f' 
    and b.attname = 'tnumberone' 
; 

Это возвращает «TestTable», что указывает, что столбец «tnumberone» таблицы «surealtable» имеет внешний ключ ссылку на таблицу «TestTable».

+0

не могли бы вы привести пример, как это будет выглядеть с некоторыми переменными .. так, например, у нас есть таблица с именем T1 и таблица T2. T1 зарубежные ссылки t2.ID из (t2.id) –

+0

Конечно. Можете ли вы изменить свой вопрос, чтобы добавить свою схему? Операторы create table будут полезны (вы можете изменить имена, просто сохраните структуру одинаково). – yieldsfalsehood

+0

Я добавил вам дополнительный пример. – yieldsfalsehood

Смежные вопросы