सभी तालिकाओं के लिए प्राथमिक कुंजी सूचीबद्ध करें - Postgresql


14

क्या कोई क्वेरी है जो ऐसा करेगी?

मुझे कुछ प्रश्न मिले जो एक तालिका के लिए ऐसा कर सकते हैं, लेकिन मैं इसे संशोधित करने में सक्षम नहीं था इसलिए मैं देख सकता हूं:

tablename | column | type

1
अगर मैं यह पूछ रहा था, तो मैं पीके में एक कॉलम की क्रमिक स्थिति जानना चाहता हूं (कुछ पीके में 1 से अधिक कॉलम हैं और ऑर्डर कुछ भी हो सकता है)।
ypercube y

जवाबों:


13

कुछ इस तरह:

select tc.table_schema, tc.table_name, kc.column_name
from information_schema.table_constraints tc
  join information_schema.key_column_usage kc 
    on kc.table_name = tc.table_name and kc.table_schema = tc.table_schema and kc.constraint_name = tc.constraint_name
where tc.constraint_type = 'PRIMARY KEY'
  and kc.ordinal_position is not null
order by tc.table_schema,
         tc.table_name,
         kc.position_in_unique_constraint;

यह क्वेरी न केवल प्राथमिक कुंजी, बल्कि अद्वितीय अनुक्रमित भी दिखाती है
मिशेल निकल्स

@ MichałNiklas यह नहीं करता है।
dezso

1
@DarielPratama: शर्त tc.constraint_type = 'PRIMARY KEY'केवल प्राथमिक कुंजी दिखाएगी। हालांकि प्रत्येक प्राथमिक कुंजी एक अद्वितीय
अनुक्रमित

2
@a_horse_with_no_name मेरा मानना ​​है कि यह गलत है। position_in_unique_constraintFOREIGN कुंजी के लिए स्थिति को इंगित करता है, यह हमेशा प्राथमिक कुंजी के लिए शून्य है। सही स्तंभ है ordinal_position। पीजी 9.4 में परीक्षण किया गया।
महानवमी

1
@a_horse_with_no_name मैंने अनाम उपयोगकर्ता द्वारा सुझाए गए संपादन को मंजूरी दे दी है। सुनिश्चित नहीं है कि यदि संपादन से गुजरेगा, तो अन्य ने अस्वीकार कर दिया है। किसी भी मामले में कृपया सुझाव और महानता से ऊपर टिप्पणी की जाँच करें। मुझे लगता है कि वे सही हैं और ordinal_positionइसका इस्तेमाल किया जाना चाहिए। position_in_unique_constraintअशक्त केवल FKS उपयोग में नहीं है।
ypercube y

20

यह अधिक सटीक उत्तर है:

select tc.table_schema, tc.table_name, kc.column_name 
from  
    information_schema.table_constraints tc,  
    information_schema.key_column_usage kc  
where 
    tc.constraint_type = 'PRIMARY KEY' 
    and kc.table_name = tc.table_name and kc.table_schema = tc.table_schema
    and kc.constraint_name = tc.constraint_name
order by 1, 2;

आप and kc.constraint_name = tc.constraint_nameभाग से चूक गए , इसलिए यह सभी बाधाओं को सूचीबद्ध करता है।


2
जब आपकी क्वेरी काम करती है, तो अधिक महत्वपूर्ण अंतर लापता and kc.position_in_unique_constraint is not nullभाग है। और आपको एएनएसआई जॉइन का उपयोग करने के लिए दृढ़ता से प्रोत्साहित किया जाता है (जबकि कई इसे स्वाद का मामला मानते हैं)।
dezso

1

कृपया इस पर भी विचार करें। यह सभी तालिकाओं को बदलने के लिए स्क्रिप्ट उत्पन्न करेगा।

SELECT STRING_AGG(FORMAT('ALTER TABLE %s CLUSTER ON %s;', A.table_name, A.constraint_name), E'\n') AS SCRIPT
FROM
(
    SELECT      FORMAT('%s.%s', table_schema, table_name) AS table_name, constraint_name
    FROM        information_schema.table_constraints
    WHERE       UPPER(constraint_type) = 'PRIMARY KEY'
    ORDER BY    table_name 
) AS A;

सवाल यह नहीं है कि तालिकाओं को कैसे बदला जाए।
ypercube y

1
मैं दूसरा क्या @ ypercubeᵀᴹsays। इस उत्तर को हटा दें, लेकिन निराश न हों - भ्रमण करें, सहायता केंद्र पर जाएं और tbe "हमें आपकी मदद करने में मदद करें" ब्लॉग पढ़ें। जैसा कि कुछ नहीं पूछा गया था, का जवाब देने के लिए, हम सभी ने बहुत बार किया है :-)। ps मंच पर आपका स्वागत है!
वेरेस

1

मुझे लगता है कि प्राथमिक कुंजी प्राप्त करना चाहिए और विदेशी कुंजी को इस तरह करना चाहिए। kpposition_in_unique_constraint शून्य नहीं है इस स्थिति में केवल विदेशी कुंजी मिल सकती है।

select tc.table_schema, tc.table_name, kc.column_name,tc.constraint_type
from 
    information_schema.table_constraints tc
    JOIN information_schema.key_column_usage kc 
        on kc.table_name = tc.table_name and kc.table_schema = tc.table_schema 
                and kc.constraint_name = tc.constraint_name
where 
--kc.position_in_unique_constraint is not null
order by tc.table_schema,
         tc.table_name,
         kc.position_in_unique_constraint;

मैं ऐसा कुछ करने की कोशिश कर रहा हूं (तालिका के नाम थोड़े अलग हैं, मैं संभवतः पोस्टग्रेज के एक अलग संस्करण पर हूं)। क्वेरी चलती है, लेकिन मुझे कोई परिणाम वापस नहीं मिलता है। क्या यह संभव है कि मेरे पास सही अनुमति नहीं है-
सजीटलिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.