2009-08-24 9 views
2

Мне было интересно, как я могу перечислить имя пользовательских таблиц с его именем первичного ключа в качестве второго столбца?Получить имя первичного ключа таблицы

Я занимаюсь половиной работы, но я не знаю, что еще нужно сделать.

select table_name from user_tables ORDER BY (table_name) ASC 

Кто-нибудь знает как?

Спасибо

+0

что вы имеете в виду с «именем таблицы пользователя»? – rogeriopvl

+0

Имена таблиц, созданных определенным пользователем (я работаю с oracle, поэтому он создает что-то вроде схемы на пользователя). – Sheldon

ответ

3

Этот простой запрос дает вам список таблиц вместе с PK имя ограничения (но не имя столбца):

select  ut.table_name, uc.constraint_name 
from  user_tables ut 
left join user_constraints uc 
    on  ut.table_name = uc.table_name 
    and  uc.constraint_type = 'P'; 

Если вы хотите, чтобы имя столбца, помните о том, что ПК может иметь несколько колонок! Нам нужно создать тип утилиты первым из сборной() агрегатной функции:

create type ty_varchar_nt as table of varchar2(4000); 

select  ut.table_name, uc.constraint_name, cast(collect (uic.column_name) as ty_varchar_nt) as pk_cols 
from  user_tables ut 
left join user_constraints uc 
    on  ut.table_name = uc.table_name 
    and  uc.constraint_type = 'P' 
left join user_ind_columns uic 
    on  uc.index_name = uic.index_name 
group by ut.table_name, uc.constraint_name; 

Если вам не нравится форматирование вложенной вкладки, вы можете написать служебную функцию, которая будет принимать в качестве входных данных NT и предоставлять конкатенированную строку с разделителями-запятыми в качестве вывода. Просто не хватает времени, чтобы сделать это сам;)

1

Попробуйте присоединиться USER_TABLES с USER_CONSTRAINTS.

В USER_CONSTRAINTS фильтр все строки с constraint_type равен 'P' (первичный ключ). Там вы получите index_name и index_owner значений, которые вы можете присоединиться к USER_INDEXES и получить имена колонок из вашего основного файла.

Хотел бы я знать более простой способ сделать это ... Но я этого не делаю.

Удачи вам!

1

вы можете использовать следующий запрос

SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner 
FROM all_constraints cons, all_cons_columns cols 
WHERE cons.constraint_type = 'P' 
AND cons.constraint_name = cols.constraint_name 
AND cons.owner = cols.owner 
ORDER BY cols.table_name, cols.position; 
Смежные вопросы