Bagaimana cara mendapatkan kolom kunci utama di Oracle?

107

Saya perlu mendapatkan nama kolom kunci utama.

Di input, saya hanya memiliki nama tabel.

Kirill A.
sumber

Jawaban:

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;

Pastikan 'TABLE_NAME' dalam huruf besar karena Oracle menyimpan nama tabel dalam huruf besar.

Richie
sumber
Terima kasih, Richie. Satu pertanyaan lagi: bagaimana cara menyandikan 'P'? Saya perlu menjalankan ini dengan "EXECUTE IMMEDIATE". terima kasih lagi.
Kirill A.
4
Saya pikir Anda hanya akan menempatkan dua tanda kutip tunggal di sekelilingnya seperti ini '' P ''
Greg Reynolds
Atau, Anda bisa mengutipnya menggunakan q.
Burhan Ali
dan constraint_type = 'R' untuk kunci asing
Abinash Bishoyi
Bekerja untuk saya ketika tidak memiliki awalan skema sebelum tabel! Terima kasih!
FearlessFuture
20

Sama seperti jawaban dari 'Richie' tapi sedikit lebih ringkas.

  1. Kueri untuk batasan pengguna saja

    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. Kueri untuk semua batasan

    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'
    );
    
Nama saya adalah
sumber
@ FearlessFuture Bagi saya itu bekerja dengan baik. Bisakah Anda menjelaskan masalah Anda dengan sedikit lebih ekspresif?
Nama-Saya-Apakah
Saya tidak mendapatkan hasil apa pun dari kueri ini, tetapi saya mendapatkan hasil dari kueri untuk jawaban yang diterima.
FearlessFuture
2
@ FearlessFuture Saya berasumsi bahwa kendala yang Anda cari bukanlah kendala pengguna. Gantikan user_constraintsdengan all_constraints.
Nama-Saya-Apakah
Hal ini menyebabkan masalah jika Anda memiliki tabel dengan nama yang sama di dua atau lebih skema - perlu juga menyertakan pemilik dalam gabungan: 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 Saya setuju Kueri kedua tidak akan berfungsi. Tetapi solusi Anda tidak efisien. Coba: "SELECT cols.column_name AS KEY_STREAM, '=' AS KEY_CONDITION, cols.column_name as KEY_LOOKUP, '' AS KEY_STREAM2 FROM user_constraints kontra, user_cons_columns cols WHERE cons.constraint_name = cols.constraint_name = CONSTRAINT_TYPE = '<TABLE_NAME>' dan cons.table_name = cols.table_name; "
Alexander Heim
2
Select constraint_name,constraint_type from user_constraints where table_name** **= TABLE_NAME ;

(Ini akan mencantumkan kunci utama dan kemudian)

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

(Ini akan memberi Anda kolom, di sini PK_XYZ adalah nama kunci utama)

Vipin Tiwari
sumber
1

Coba Kode Ini Di sini saya membuat tabel untuk mendapatkan kolom kunci primer di oracle yang disebut test dan kemudian 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;
Kobir
sumber
0

Simpan skrip berikut sebagai sesuatu seperti 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');

Kemudian bisa dipanggil menggunakan

@findPK
Bugalugs Nash
sumber