Comment obtenir la colonne de clé primaire dans Oracle?


108

J'ai besoin d'obtenir le nom de la colonne de clé primaire.

Dans l'entrée, je n'ai que le nom de la table.

Réponses:


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;

Assurez-vous que «TABLE_NAME» est en majuscules car Oracle stocke les noms de table en majuscules.


Merci, Richie. Encore une question: comment encoder «P»? J'ai besoin d'exécuter ceci avec "EXECUTE IMMEDIATE". thnx à nouveau.
Kirill A.

4
Je pense que vous voudriez simplement mettre deux guillemets simples autour de lui comme ceci `` P ''
Greg Reynolds

Vous pouvez également le citer en utilisant q.
Burhan Ali

et constraint_type = 'R' pour la clé étrangère
Abinash Bishoyi

A fonctionné pour moi sans avoir le préfixe de schéma avant la table! Merci!
FearlessFuture

20

Identique à la réponse de «Richie» mais un peu plus concis.

  1. Requête pour les contraintes utilisateur uniquement

    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. Requête pour toutes les contraintes

    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 Pour moi, cela a bien fonctionné. Pouvez-vous décrire votre problème de manière un peu plus expressive?
My-Name-Is

Je n'obtiens aucun résultat de cette requête, mais j'obtiens des résultats de la requête pour la réponse acceptée.
FearlessFuture

2
@FearlessFuture Je suppose que la contrainte que vous recherchez n'est pas une contrainte utilisateur. Remplacez user_constraintspar all_constraints.
Mon nom est le

Cela cause des problèmes si vous avez une table avec le même nom dans deux schémas ou plus - vous devez également inclure le propriétaire dans la jointure: 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 J'accepte que la deuxième requête ne fonctionnera pas. Mais votre solution est inefficace. Essayez: "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 et CONSTRAint_name = cols.constraint_name et CONSTRAINT_name ' = '<TABLE_NAME>' et cons.table_name = cols.table_name; "
Alexander Heim le

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

(Cela listera la clé primaire puis)

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

(Cela vous donnera la colonne, ici PK_XYZ est le nom de la clé primay)


1

Essayez ce code Ici, j'ai créé une table pour obtenir la colonne de clé primaire dans oracle qui est appelée test, puis requête

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

Enregistrez le script suivant comme quelque chose comme 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');

Il peut alors être appelé en utilisant

@findPK
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.