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;

Oracleではテーブル名が大文字で格納されるため、「TABLE_NAME」が大文字であることを確認してください。


ありがとう、リッチー。もう1つの質問:「P」をエンコードする方法 これを「EXECUTE IMMEDIATE」で実行する必要があります。再びthnx。
キリルA.

4
この '' P ''のように2つの単一引用符で囲むとよいと思います
グレッグレイノルズ

または、を使用して引用することもできますq
Burhan Ali

そして、外部キーのconstraint_type = 'R'
Abinash Bishoyi

テーブルの前にスキーマプレフィックスがない場合、私のために働いた!ありがとう!
FearlessFuture

20

「Richie」の回答と同じですが、もう少し簡潔です。

  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私にとってはうまくいきました。あなたの問題をもう少し表現力豊かに説明できますか?
私の名前は

このクエリから結果は得られませんが、受け入れられた回答のクエリから結果は得られます。
FearlessFuture

2
@FearlessFutureあなたが探している制約はユーザー制約ではないと思います。置き換えuser_constraintsによってall_constraints
私の名前は

これは、2つの以上のスキーマに同じ名前のテーブルを持っている場合は、トラブルの原因となる-必要も参加して所有者を含める: 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 2番目のクエリが機能しないことに同意します。しかし、あなたのソリューションは非効率的です。「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 and CONSTRAINT_TYPE = CONSTRAINT_TYPE = '<TABLE_NAME>' and 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が主要なキー名です)


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.