Jak zdobyć kolumnę klucza podstawowego w Oracle?

108

Muszę uzyskać nazwę kolumny klucza podstawowego.

Na wejściu mam tylko nazwę tabeli.

Kirill A.
źródło

Odpowiedzi:

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;

Upewnij się, że „TABLE_NAME” jest zapisane dużymi literami, ponieważ Oracle przechowuje nazwy tabel wielkimi literami.

Richie
źródło
Dzięki, Richie. Jeszcze jedno pytanie: jak zakodować „P”? Muszę to wykonać za pomocą „WYKONAJ NATYCHMIAST”. thnx ponownie.
Kirill A.
4
Myślę, że po prostu umieściłbyś dwa pojedyncze cudzysłowy w taki sposób, jak to
Greg Reynolds
Alternatywnie możesz go zacytować za pomocą q.
Burhan Ali
and constraint_type = 'R' dla klucza obcego
Abinash Bishoyi
Działało dla mnie, gdy nie miałem prefiksu schematu przed tabelą! Dzięki!
FearlessFuture
20

Taka sama jak odpowiedź z „Richie”, ale nieco bardziej zwięzła.

  1. Zapytanie tylko o ograniczenia użytkownika

    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. Zapytanie dla wszystkich ograniczeń

    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'
    );
Nazywam się
źródło
@FearlessFuture Dla mnie to działało dobrze. Czy możesz opisać swój problem nieco bardziej wyraziście?
My-Name-Is
Nie otrzymuję żadnych wyników z tego zapytania, ale otrzymuję wyniki z zapytania o zaakceptowaną odpowiedź.
FearlessFuture
2
@FearlessFuture Zakładam, że ograniczenie, którego szukasz, nie jest ograniczeniem użytkownika. Wymień user_constraintsna all_constraints.
My-Name-Is
Powoduje to problemy, jeśli masz tabelę z tej samej nazwie w dwóch lub więcej schematów - konieczność także właścicielami we dołączyć: 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;
Mark Stewart
1
@MarkStewart Zgadzam się, drugie zapytanie nie będzie działać. Ale twoje rozwiązanie jest nieefektywne. Spróbuj: „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.constraint_name i CONSTRAtable_name ' = '<TABLE_NAME>' i cons.table_name = cols.table_name; "
Alexander Heim
2
Select constraint_name,constraint_type from user_constraints where table_name** **= TABLE_NAME ;

(Spowoduje to wyświetlenie klucza podstawowego, a następnie)

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

(To da ci kolumnę, tutaj PK_XYZ to nazwa klucza podstawowego)

Vipin Tiwari
źródło
1

Wypróbuj ten kod Tutaj utworzyłem tabelę do pobierania kolumny klucza podstawowego w Oracle, która nazywa się test, a następnie zapytanie

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;
Kobir
źródło
0

Zapisz następujący skrypt jako coś takiego jak 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');

Następnie można go wywołać za pomocą

@findPK
Bugalugs Nash
źródło