2008-11-07 5 views
14

this question के लिए, लेकिन MySQL के लिए इसी तरह के ....MySQL: प्रोग्रामेटिक रूप से विदेशी कुंजी संबंधों को कैसे निर्धारित करें?

मैं कैसे प्रोग्राम के रूप में MySQL में विदेशी कुंजी संदर्भ निर्धारित कर सकते हैं (InnoDB कल्पना करते हुए)? मैं लगभग उन लोगों के साथ मिल कर सकते हैं:

SHOW TABLE STATUS WHERE Name = 'MyTableName'; 

... लेकिन अफसोस, टिप्पणी स्तंभ जो इस जानकारी में से कुछ को शामिल करने लगता है छोटा कर दिया जाता है तो मैं उस पर भरोसा नहीं कर सकते। कुछ और तरीका होना चाहिए ...

मैं एक सीपीआई कॉल, एक एसक्यूएल कथन, कुछ भी से खुश हूं - मुझे बस कुछ काम करने की ज़रूरत है।

नोट: मैंने "टैबलेट MyTableName बनाएं" कथन के परिणामों को पार्स करने पर भी विचार किया है, लेकिन मुझे उम्मीद है कि कुछ आसान है।

उत्तर

29

प्रयास करें दो तालिकाओं आप इस जानकारी को प्राप्त करने के लिए क्वेरी कर सकते हैं: INFORMATION_SCHEMA.TABLE_CONSTRAINTS और INFORMATION_SCHEMA.KEY_COLUMN_USAGE

ऊपर दिए गए पृष्ठ पर टिप्पणियों से एक प्रश्न यहां दिया गया है, जो दर्शाता है कि आप जो जानकारी प्राप्त करते हैं उसे कैसे प्राप्त करें।

SELECT CONCAT(table_name, '.', column_name, ' -> ', 
    referenced_table_name, '.', referenced_column_name) AS list_of_fks 
FROM INFORMATION_SCHEMA.key_column_usage 
WHERE referenced_table_schema = 'test' 
    AND referenced_table_name IS NOT NULL 
ORDER BY table_name, column_name; 

ऊपर 'test' के स्थान पर अपने स्कीमा नाम का प्रयोग करें।

SELECT CONSTRAINT_SCHEMA AS db, 
     CONCAT (
      TABLE_NAME, 
      '.', 
      COLUMN_NAME, 
      ' -> ', 
      REFERENCED_TABLE_NAME, 
      '.', 
      REFERENCED_COLUMN_NAME 
     ) AS relationship 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_NAME = 'your_table_name' 
ORDER BY CONSTRAINT_SCHEMA, 
     TABLE_NAME, 
     COLUMN_NAME; 

इस मामले मैं "your_table_name" क्षेत्रों के साथ संबंधों के आधार पर फ़िल्टर किया गया था और देख रहा है जो डेटाबेस से संबंध की बात आती है:

+0

धन्यवाद, बिल। यह चाल सिर्फ पूरी तरह से किया था! –

+0

एक बहुत धीमी क्वेरी .... '/ * 0 पंक्तियां प्रभावित हुईं, 22 पंक्तियां मिलीं। 1 क्वेरी के लिए अवधि: 2,996 सेकंड। */' –

+0

@ वी-लाइट, आपके पास एक और समाधान है? –

2

INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

+0

मुझे लगता है कि उस तालिका में प्रतीत नहीं होता है, हालांकि मेरे पास INFORMATION_SCHEMA.TABLE_CONSTRAINTS है जो मुझे आवश्यक जानकारी (लेकिन बिल्कुल नहीं) है। फिर भी धन्यवाद! –

7

यहाँ आप @bill समाधान से कुछ ज्यादा सुधार की है।

-1
SELECT TABLE_NAME, 
     COLUMN_NAME, 
     CONSTRAINT_NAME, 
     REFERENCED_TABLE_NAME, 
     REFERENCED_COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_NAME = 'table_name' 
     AND TABLE_SCHEMA = 'table_schema'; 
+0

आपकी क्वेरी काम करने लगती है, लेकिन कृपया समुदाय को यह बताएं कि यह कैसे काम करता है। – cb0

संबंधित मुद्दे