Wie erhalte ich die Primärschlüsselspalte in Oracle?


107

Ich muss den Namen der Primärschlüsselspalte erhalten.

In der Eingabe habe ich nur den Tabellennamen.

Antworten:


189
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;

Stellen Sie sicher, dass 'TABLE_NAME' in Großbuchstaben geschrieben ist, da Oracle Tabellennamen in Großbuchstaben speichert.


Danke, Richie. Noch eine Frage: Wie codiere ich 'P'? Ich muss dies mit "EXECUTE IMMEDIATE" ausführen. Nochmals vielen Dank.
Kirill A.

4
Ich denke, Sie würden nur zwei einfache Anführungszeichen wie dieses '' P '' setzen
Greg Reynolds

Alternativ können Sie es auch mit zitierenq .
Burhan Ali

und Constraint_Type = 'R' für Fremdschlüssel
Abinash Bishoyi

Hat bei mir funktioniert, wenn das Schema-Präfix nicht vor der Tabelle steht! Vielen Dank!
FearlessFuture

19

Wie die Antwort von 'Richie', aber etwas prägnanter.

  1. Abfrage nur für Benutzereinschränkungen

    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. Abfrage für alle Einschränkungen

    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 Für mich hat es gut funktioniert. Können Sie Ihr Problem etwas ausdrucksvoller beschreiben?
Mein Name ist der

Ich erhalte keine Ergebnisse aus dieser Abfrage, aber ich erhalte Ergebnisse aus der Abfrage für die akzeptierte Antwort.
FearlessFuture

2
@FearlessFuture Ich gehe davon aus, dass die gesuchte Einschränkung keine Benutzereinschränkung ist. Ersetzen user_constraintsdurch all_constraints.
Mein Name ist der

Dies verursacht Probleme, wenn Sie eine Tabelle mit demselben Namen in zwei oder mehr Schemata haben - müssen auch den Eigentümer in den Join einbeziehen: 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 Ich bin damit einverstanden, dass die zweite Abfrage nicht funktioniert. Ihre Lösung ist jedoch ineffizient. Versuchen Sie: "SELECT cols.column_name AS KEY_STREAM, '=' AS KEY_CONDITION, cols.column_name als KEY_LOOKUP, '' AS KEY_STREAM2 FROM user_constraints cons, user_cons_columns cols WHERE cons.constraint_name = cols.constraint_name und CONSTRAINT_name = '<TABLE_NAME>' und cons.table_name = cols.table_name; "
Alexander Heim

2
Select constraint_name,constraint_type from user_constraints where table_name** **= TABLE_NAME ;

(Dies listet den Primärschlüssel auf und dann)

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

(Dies gibt Ihnen die Spalte, hier ist PK_XYZ der Primay-Schlüsselname)


1

Versuchen Sie diesen Code Hier habe ich eine Tabelle zum Abrufen der Primärschlüsselspalte in Oracle erstellt, die als Test und anschließende Abfrage bezeichnet wird

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

Speichern Sie das folgende Skript als 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');

Es kann dann mit aufgerufen werden

@findPK
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.