MySQL में, मैं किसी विशेष तालिका की ओर इशारा करते हुए सभी विदेशी प्रमुख बाधाओं की एक सूची कैसे प्राप्त करूं? एक विशेष कॉलम यह ओरेकल के प्रश्न के समान ही है , लेकिन MySQL के लिए।
MySQL में, मैं किसी विशेष तालिका की ओर इशारा करते हुए सभी विदेशी प्रमुख बाधाओं की एक सूची कैसे प्राप्त करूं? एक विशेष कॉलम यह ओरेकल के प्रश्न के समान ही है , लेकिन MySQL के लिए।
जवाबों:
एक मेज के लिए:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>';
एक कॉलम के लिए:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>' AND
REFERENCED_COLUMN_NAME = '<column>';
मूल रूप से, हमने REFERENCED_TABLE_NAME को REFERENCED_COLUMN_NAME के साथ उस खंड में बदल दिया है।
where REFERENCED_TABLE_SCHEMA = 'mydatabase' and REFERENCED_TABLE_NAME = 'mytable'
संपादित करें: जैसा कि टिप्पणियों में बताया गया है, यह ओपीएस प्रश्न का सही उत्तर नहीं है, लेकिन इस आदेश को जानना उपयोगी है। यह प्रश्न Google में दिखाया गया था कि मैं क्या देख रहा था, और लगा कि मैं दूसरों को खोजने के लिए इस उत्तर को छोड़ दूंगा।
SHOW CREATE TABLE `<yourtable>`;
मुझे यह जवाब यहां मिला: MySQL: टेबल कमांड पर अड़चनें दिखाना
मुझे इस तरह की आवश्यकता थी क्योंकि मैं यह देखना चाहता था कि एफके कैसे कार्य करता है, बजाय इसके कि वह मौजूद है या नहीं।
<yourtable>
नहीं जो इंगित करता है <yourtable>
।
display foreign keys mysql
गूगल का पहला परिणाम है , इसीलिए ऐसा हो सकता है;)
यदि आप InnoDB का उपयोग करते हैं और FK को परिभाषित करते हैं, तो आप information_schema डेटाबेस को क्वेरी कर सकते हैं जैसे:
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable';
कुछ उपयोगी जानकारी जोड़ने के लिए एक पुराने उत्तर पर पोस्ट करना।
मुझे भी ऐसी ही समस्या थी, लेकिन मैं REFERENCED तालिका और स्तंभ नामों के साथ CONSTRAINT_TYPE भी देखना चाहता था। इसलिए,
अपनी तालिका में सभी FK देखने के लिए:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE()
AND i.TABLE_NAME = '<yourtable>';
अपने स्कीमा में सभी तालिकाओं और FK को देखने के लिए:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE();
अपने डेटाबेस में सभी FK देखने के लिए:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY';
याद है!
यह InnoDB स्टोरेज इंजन का उपयोग कर रहा है। यदि आप उन्हें जोड़ने के बाद दिखाने के लिए कोई भी विदेशी कुंजी प्राप्त नहीं कर सकते, तो यह संभवत: इसलिए है क्योंकि आपकी तालिकाएँ MyISAM का उपयोग कर रही हैं।
जाँच करने के लिए:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
इसे ठीक करने के लिए, इसका उपयोग करें:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
नोड के उत्तर के विकल्प के रूप में, यदि आप InnoDB का उपयोग करते हैं और FK को परिभाषित करते हैं तो आप information_schema डेटाबेस को क्वेरी कर सकते हैं:
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND TABLE_NAME = '<table>'
<तालिका>, या से विदेशी कुंजी के लिए
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND REFERENCED_TABLE_NAME = '<table>'
विदेशी कुंजी के लिए <तालिका>
आप चाहें तो UPDATE_RULE और DELETE_RULE भी प्राप्त कर सकते हैं।
यह समाधान न केवल सभी संबंधों को प्रदर्शित करेगा, बल्कि बाधा नाम भी होगा, जो कुछ मामलों में आवश्यक है (जैसे ड्रॉप गर्भनिरोधक):
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null;
यदि आप किसी विशिष्ट डेटाबेस में तालिकाओं की जांच करना चाहते हैं, तो क्वेरी के अंत में स्कीमा नाम जोड़ें:
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null
and table_schema = 'database_name';
इसी तरह, एक विशिष्ट कॉलम नाम के लिए, जोड़ें
और table_name = 'table_name
क्वेरी के अंत में।
यहाँ इस पोस्ट से प्रेरित है
अपने एफके (विदेशी कुंजी संदर्भ) को सूचीबद्ध करने का एक त्वरित तरीका
KEY_COLUMN_USAGE view:
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 = (your schema name here)
AND REFERENCED_TABLE_NAME is not null
ORDER BY TABLE_NAME, COLUMN_NAME;
यह क्वेरी मानती है कि बाधाएँ और सभी संदर्भित और संदर्भित तालिका एक ही स्कीमा में हैं।
अपनी टिप्पणी जोड़ें।
स्रोत: आधिकारिक mysql मैनुअल
मैं जिस समाधान के साथ आया वह नाजुक है; यह विदेशी कुंजियों के लिए django के नामकरण सम्मेलन पर निर्भर करता है।
USE information_schema;
tee mysql_output
SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
notee
फिर, शेल में,
grep 'refs_tablename_id' mysql_output
किसी विशेष विदेशी कुंजी वाले सभी तालिकाओं को खोजने के लिए जैसेemployee_id
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';
यदि आप विदेशी कुंजी कॉलम का नाम भी प्राप्त करना चाहते हैं:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME,
i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME,
k.COLUMN_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k
ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.TABLE_SCHEMA = '<TABLE_NAME>' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY i.TABLE_NAME;