ओरेकल में प्राथमिक कुंजी कॉलम कैसे प्राप्त करें?


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;

सुनिश्चित करें कि 'TABLE_NAME' ऊपरी मामले में है, क्योंकि Oracle ऊपरी मामले में तालिका नामों को संग्रहीत करता है।


धन्यवाद, रिची। एक और सवाल: 'P' को कैसे एनकोड करना है? मुझे इसे "एक्जाम IMMEDIATE" के साथ निष्पादित करने की आवश्यकता है। फिर से thnx।
किरिल ए।

4
मुझे लगता है कि आप सिर्फ दो सिंगल कोट्स को इस '' पी '' की तरह राउंड
ग्रेग रेनॉल्ड्स

वैकल्पिक रूप से, आप इसका उपयोग करके उद्धृत कर सकते हैं q
बुरहान अली

और विदेशी कुंजी के लिए constraint_type = 'R'
Abinash Bishoyi

तालिका के पहले स्कीमा उपसर्ग नहीं होने पर मेरे लिए काम किया! धन्यवाद!
फियरलेस

20

'रिची' से जवाब के रूप में ही लेकिन थोड़ा और अधिक संक्षिप्त।

  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 मेरे लिए यह अच्छी तरह से काम किया। क्या आप अपनी समस्या को थोड़ा अधिक अभिव्यंजक बता सकते हैं?
मेरा नाम-

मुझे इस क्वेरी से कोई परिणाम नहीं मिलता है, लेकिन मुझे स्वीकृत उत्तर के लिए क्वेरी से परिणाम मिलते हैं।
फियरलेस

2
@FearlessFuture मैं मानता हूं कि आप जो बाधा खोज रहे हैं, वह उपयोगकर्ता बाधा नहीं है। user_constraintsद्वारा प्रतिस्थापित करें all_constraints
मेरा नाम-

यदि आपको दो या अधिक स्कीमा में एक ही नाम वाली तालिका है, तो यह परेशानी का कारण बनता है - इसमें शामिल होने के लिए स्वामी को भी शामिल करने की आवश्यकता है: 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 मैं सहमत हूं कि दूसरा प्रश्न काम नहीं करेगा। लेकिन आपका समाधान अक्षम है। आज़माएं: "SELECT cols.column_name AS KEY_STREAM, '=' AS KEY_CONDITION, cols.column_name as KEY_LOOKUP, '' AS KEY_STREAM2 के रूप में, user_consttsts विपक्ष से, user_cons_columns cols WHERE cons.constraint_name = cols.sive/sts.sive/sestrestest = '<TABLE_NAME>' और 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’; 

(यह आपको कॉलम देगा, यहां पीके_एक्सवाईजेड प्रमुख नाम है)


1

इस कोड का प्रयास करें यहां मैंने ओरेकल में प्राथमिक कुंजी कॉलम प्राप्त करने के लिए एक तालिका बनाई है जिसे परीक्षण और फिर क्वेरी कहा जाता है

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.