Как получить столбец первичного ключа в Oracle?

108

Мне нужно получить имя столбца первичного ключа.

На входе у меня только имя таблицы.

Кирилл А.
источник

Ответы:

191
SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner
FROM all_constraints cons, all_cons_columns cols
WHERE cols.table_name = 'TABLE_NAME'
AND cons.constraint_type = 'P'
AND cons.constraint_name = cols.constraint_name
AND cons.owner = cols.owner
ORDER BY cols.table_name, cols.position;

Убедитесь, что «TABLE_NAME» написана в верхнем регистре, поскольку Oracle хранит имена таблиц в верхнем регистре.

Ричи
источник
Спасибо, Ричи. Еще один вопрос: как кодировать "P"? Мне нужно выполнить это с помощью «ВЫПОЛНИТЬ НЕМЕДЛЕННО». спасибо еще раз.
Кирилл А.
4
Я думаю, вы бы просто заключили это в две одинарные кавычки, например, "P"
Грег Рейнольдс
В качестве альтернативы вы можете процитировать его, используя q.
Бурхан Али
и constraint_type = 'R' для внешнего ключа
Абинаш Бишой,
Работал для меня, когда перед таблицей не было префикса схемы! Спасибо!
FearlessFuture
20

То же, что и ответ «Ричи», но немного более кратко.

  1. Запрос только для ограничений пользователя

    SELECT column_name FROM all_cons_columns WHERE constraint_name = (
      SELECT constraint_name FROM user_constraints 
      WHERE UPPER(table_name) = UPPER('tableName') AND CONSTRAINT_TYPE = 'P'
    );
  2. Запрос на все ограничения

    SELECT column_name FROM all_cons_columns WHERE constraint_name = (
      SELECT constraint_name FROM all_constraints 
      WHERE UPPER(table_name) = UPPER('tableName') AND CONSTRAINT_TYPE = 'P'
    );
Меня зовут
источник
@FearlessFuture Для меня это сработало. Можете ли вы описать вашу проблему более выразительно?
My-Name-Is
Я не получаю никаких результатов по этому запросу, но я получаю результаты по запросу для принятого ответа.
FearlessFuture
2
@FearlessFuture Я предполагаю, что ограничение, которое вы ищете, не является ограничением пользователя. Заменить user_constraintsна all_constraints.
My-Name-Is
Это вызывает проблемы, если у вас есть таблица с одинаковым именем в двух или более схемах - необходимо также включить владельца в объединение: SELECT owner, column_name, position FROM all_cons_columns WHERE (owner, constraint_name) in (SELECT owner, constraint_name FROM all_constraints WHERE UPPER(table_name) = UPPER('&tableName') AND CONSTRAINT_TYPE = 'P') order by owner, position;
Марк Стюарт,
1
@MarkStewart Я согласен, что второй запрос не будет работать. Но ваше решение неэффективно. Попробуйте: «SELECT cols.column_name AS KEY_STREAM, '=' AS KEY_CONDITION, cols.column_name as KEY_LOOKUP, '' AS KEY_STREAM2 FROM user_constraints cons, user_cons_columns cols WHERE cons.constraint_name = cols.Entertable_name и cons. = '<TABLE_NAME>' и cons.table_name = cols.table_name; "
Александр Хейм
2
Select constraint_name,constraint_type from user_constraints where table_name** **= TABLE_NAME ;

(Это будет список первичного ключа, а затем)

Select column_name,position from user_cons_cloumns where constraint_name=’PK_XYZ’; 

(Это даст вам столбец, здесь PK_XYZ - это имя первичного ключа)

Випин Тивари
источник
1

Попробуйте этот код Здесь я создал таблицу для получения столбца первичного ключа в Oracle, который называется тестом, а затем запросом

create table test
(
id int,
name varchar2(20),
city varchar2(20),
phone int,
constraint pk_id_name_city primary key (id,name,city)
);

SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner FROM all_constraints cons, all_cons_columns cols WHERE cols.table_name = 'TEST' AND cons.constraint_type = 'P' AND cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner  ORDER BY cols.table_name, cols.position;
Кобир
источник
0

Сохраните следующий сценарий как что-то вроде findPK.sql.

set verify off
accept TABLE_NAME char prompt 'Table name>'

SELECT cols.column_name
FROM all_constraints cons NATURAL JOIN all_cons_columns cols
WHERE cons.constraint_type = 'P' AND table_name = UPPER('&TABLE_NAME');

Затем его можно вызвать с помощью

@findPK
Бугалугс Наш
источник