Як отримати стовпчик первинного ключа в Oracle?


107

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

У введенні у мене є лише назва таблиці.

Відповіді:


190
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.
Бурхан Алі

and constraint_type = 'R' для зовнішнього ключа
Abinash Bishoyi

Працював для мене, коли не мав префікса схеми перед таблицею! Дякую!
Безстрашний

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 - Є

Я не отримую жодних результатів від цього запиту, але отримую результати за запитом для прийнятої відповіді.
Безстрашний

2
@FearlessFuture Я припускаю, що обмеження, яке ви шукаєте, не є обмеженням для користувача. Замінити user_constraintsна all_constraints.
Моє ім’я -

Це спричиняє проблеми, якщо у вас є однакова таблиця у двох чи більше схемах - потрібно також включити власника в приєднання: 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 мінусів, user_cons_column cols WHERE cons.constraint_name = coname.і name_ cols.constraint_name_' cols.constraint_name_ cols.constraint_name_ 'cols.constraint_name_' cols.constraint_name_ 'cols.constraint_name_' cols.constraint_name_ 'cols.constraint_name_' cols. = '<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 - це ім'я ключа primay)


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.