Come ottenere la colonna della chiave primaria in Oracle?


107

Devo ottenere il nome della colonna della chiave primaria.

Nell'input ho solo il nome della tabella.

Risposte:


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;

Assicurati che "TABLE_NAME" sia in maiuscolo poiché Oracle memorizza i nomi delle tabelle in maiuscolo.


Grazie, Richie. Un'altra domanda: come codificare la "P"? Devo eseguirlo con "ESEGUI IMMEDIATO". grazie di nuovo.
Kirill A.

4
Penso che dovresti semplicemente mettere due virgolette singole attorno a questo `` P ''
Greg Reynolds,

In alternativa, puoi citarlo usando q.
Burhan Ali

and constraint_type = 'R' for foreign key
Abinash Bishoyi

Ha funzionato per me quando non avevo il prefisso dello schema prima della tabella! Grazie!
FearlessFuture

20

Come la risposta di "Richie" ma un po 'più concisa.

  1. Interroga solo i vincoli dell'utente

    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. Query per tutti i vincoli

    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 Per me ha funzionato bene. Puoi descrivere il tuo problema un po 'più espressivo?
My-Name-Is

Non ottengo alcun risultato da questa query, ma ottengo risultati dalla query per la risposta accettata.
FearlessFuture

2
@ FearlessFuture Presumo che il vincolo che stai cercando non sia un vincolo dell'utente. Sostituisci user_constraintscon all_constraints.
My-Name-Is

Ciò causa problemi se hai una tabella con lo stesso nome in due o più schemi - devi includere anche il proprietario nel join: 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 Sono d'accordo che la seconda Query non funzionerà. Ma la tua soluzione è inefficiente. Prova: "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 e CONSTRAINT_TYPE. = "<TABLE_NAME>" e cons.table_name = cols.table_name; "
Alexander Heim

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

(Questo elencherà la chiave primaria e poi)

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

(Questo ti darà la colonna, qui PK_XYZ è il nome della chiave principale)


1

Prova questo codice Qui ho creato una tabella per ottenere la colonna della chiave primaria in Oracle che si chiama test e quindi query

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

Salva il seguente script come qualcosa come 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');

Può quindi essere chiamato utilizzando

@findPK
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.