2010-06-11 9 views
61

मुझे किसी विशेष डेटाबेस से सभी बाधाओं की सूची कैसे प्राप्त हो सकती है?MySQL डेटाबेस से बाधाओं की सूची

+0

MySQL में एक से अधिक प्रकार की बाधा है। तुम्हारा क्या मतलब है? क्या आप उस चीज का उदाहरण दे सकते हैं जिसे आप ढूंढ रहे हैं? –

उत्तर

102

बाधाओं प्रत्येक मेज पर परिभाषित के नाम पाने के लिए information_schema.table_constraints तालिका का उपयोग करें:

select * 
from information_schema.key_column_usage 
where constraint_schema = 'YOUR_DB' 

हैं:

select * 
from information_schema.table_constraints 
where constraint_schema = 'YOUR_DB' 

उपयोग information_schema.key_column_usage तालिका उन बाध्यताओं से हर एक में खेतों प्राप्त करने के लिए इसके बजाय आप विदेशी कुंजी बाधाओं के बारे में बात कर रहे हैं, information_schema.referential_constraints का उपयोग करें:

select * 
from information_schema.referential_constraints 
where constraint_schema = 'YOUR_DB' 
+0

इस सूची में केवल अद्वितीय, प्राथमिक कुंजी, या विदेशी कुंजी बाधाएं शामिल होंगी। जांच संभव है, लेकिन लागू नहीं है। इस क्वेरी का उपयोग करके डिफॉल्ट बाधाएं दिखाई नहीं देगी। –

+0

MySQL चेक बाधाओं को स्टोर नहीं करता है। यदि आप एक को परिभाषित करने का प्रयास करते हैं, तो यह पार्स और चुपचाप इसे छोड़ देता है। –

+1

DEFAULT मान एक बाधा के रूप में नहीं गिना जाता है। यह 'info_schema.columns.column_default' में संग्रहीत है। –

16

@Senseपूर्ण द्वारा शानदार उत्तर।

मैं जो केवल बाधा नाम (और नहीं अन्य विवरण/कॉलम) की सूची के लिए देख रहे लोगों के लिए संशोधित क्वेरी पेश कर रहा हूँ:

SELECT DISTINCT(constraint_name) 
FROM information_schema.table_constraints 
WHERE constraint_schema = 'YOUR_DB' 
ORDER BY constraint_name ASC; 
+1

यदि आपको इसे खोजने के बाद एक को हटाने की आवश्यकता है, तो यहां देखें http://stackoverflow.com/a/838412/2401804 – r3wt

-2

चयन USER_CONSTRAINTS से * कहां TABLE_NAME = "tabnam";

0

यह वास्तव में मदद करता है, तो आप इस तरह के ON_UPDATE और ON_DELETE और स्तंभ और विदेशी स्तंभ नाम के रूप में उन बाधाओं के चारों ओर सब एक साथ प्राथमिक और विदेशी कुंजी की कमी के साथ-साथ नियम देखना चाहते हैं:

SELECT tc.constraint_schema,tc.constraint_name,tc.table_name,tc.constraint_type,kcu.table_name,kcu.column_name,kcu.referenced_table_name,kcu.referenced_column_name,rc.update_rule,rc.delete_rule 

FROM information_schema.table_constraints tc 

inner JOIN information_schema.key_column_usage kcu 
ON tc.constraint_catalog = kcu.constraint_catalog 
AND tc.constraint_schema = kcu.constraint_schema 
AND tc.constraint_name = kcu.constraint_name 
AND tc.table_name = kcu.table_name 

LEFT JOIN information_schema.referential_constraints rc 
ON tc.constraint_catalog = rc.constraint_catalog 
AND tc.constraint_schema = rc.constraint_schema 
AND tc.constraint_name = rc.constraint_name 
AND tc.table_name = rc.table_name 

WHERE tc.constraint_schema = 'my_db_name' 

तुम भी चाहते हो सकता है उन कॉलमों के बारे में कुछ और जानकारी जोड़ने के लिए, बस इसे SQL में जोड़ें (और इच्छित कॉलम चुनें):

LEFT JOIN information_schema.COLUMNS c 
ON kcu.constraint_schema = c.table_schema 
AND kcu.table_name = c.table_name 
AND kcu.column_name = c.column_name 
संबंधित मुद्दे