उन सभी तालिकाओं को कैसे खोजा जा सकता है जिनमें विदेशी कुंजियाँ होती हैं जो विशेष तालिका का संदर्भ देती हैं। कॉलम और उन विदेशी कुंजियों के लिए मान हैं?


272

मेरे पास एक मेज है जिसकी प्राथमिक कुंजी को विदेशी कुंजी के रूप में कई अन्य तालिकाओं में संदर्भित किया गया है। उदाहरण के लिए:

  CREATE TABLE `X` (
    `X_id` int NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    PRIMARY KEY  (`X_id`)
  )
  CREATE TABLE `Y` (
    `Y_id` int(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    `X_id` int DEFAULT NULL,
    PRIMARY KEY  (`Y_id`),
    CONSTRAINT `Y_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  )
  CREATE TABLE `Z` (
    `Z_id` int(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    `X_id` int DEFAULT NULL,
    PRIMARY KEY  (`Z_id`),
    CONSTRAINT `Z_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  )

अब, मुझे नहीं पता कि डेटाबेस में कितनी टेबल हैं जिनमें एक्स और टेबल की तरह एक्स में विदेशी कुंजी हैं। क्या कोई SQL क्वेरी है जिसे मैं वापस करने के लिए उपयोग कर सकता हूं:

  1. टेबल की एक सूची जिसमें एक्स में विदेशी चाबियाँ हैं
  2. और उन तालिकाओं में से वास्तव में विदेशी कुंजी में कौन से मूल्य हैं

जवाबों:


384

हेयर यू गो:

USE information_schema;
SELECT *
FROM
  KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'X'
  AND REFERENCED_COLUMN_NAME = 'X_id';

यदि आपके पास समान तालिकाओं / स्तंभ नामों के साथ कई डेटाबेस हैं, तो आप अपनी क्वेरी को किसी विशेष डेटाबेस तक सीमित करना चाह सकते हैं:

SELECT *
FROM
  KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'X'
  AND REFERENCED_COLUMN_NAME = 'X_id'
  AND TABLE_SCHEMA = 'your_database_name';

7
TABLE_NAME को और बेहतर तरीके से चुनें फिर
सेलेक्ट

यह किस प्रकार का DB उपयोगी है? माई एसक्यूएल?
Cirelli94

2
@ Cirelli94 प्रश्न को MySQL प्रश्न के रूप में चिह्नित किया गया है।
mikeschuld

61

MySQL 5.5 संदर्भ मैनुअल: "InnoDB और प्रमुख कुंजी बाधाओं"

SELECT
  ke.REFERENCED_TABLE_SCHEMA parentSchema,
  ke.referenced_table_name parentTable,
  ke.REFERENCED_COLUMN_NAME parentColumnName,
  ke.TABLE_SCHEMA ChildSchema,
  ke.table_name childTable,
  ke.COLUMN_NAME ChildColumnName
FROM
  information_schema.KEY_COLUMN_USAGE ke
WHERE
  ke.referenced_table_name IS NOT NULL
  AND ke.REFERENCED_COLUMN_NAME = 'ci_id' ## Find Foreign Keys linked to this Primary Key
ORDER BY
  ke.referenced_table_name;

21

यह समाधान न केवल सभी संबंधों को प्रदर्शित करेगा बल्कि बाधा नाम भी होगा, जो कुछ मामलों में आवश्यक है (जैसे ड्रॉप बाधा):

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';

15

आप बुद्धिमानी से नामित सभी स्कीमा संबंधित जानकारी पा सकते हैं information_schema तालिका ।

आप तालिका जांच करना चाह सकते REFERENTIAL_CONSTRAINTSऔर KEY_COLUMN_USAGE। पूर्व आपको बताता है कि किन तालिकाओं को दूसरों द्वारा संदर्भित किया जाता है; उत्तरार्द्ध आपको बताएगा कि उनके क्षेत्र कैसे संबंधित हैं।


5

विवरण सहित db में सभी विदेशी कुंजियों को सूचीबद्ध करना

    SELECT  
    i1.CONSTRAINT_NAME, i1.TABLE_NAME,i1.COLUMN_NAME,
    i1.REFERENCED_TABLE_SCHEMA,i1.REFERENCED_TABLE_NAME, i1.REFERENCED_COLUMN_NAME,
    i2.UPDATE_RULE, i2.DELETE_RULE 
    FROM   
    information_schema.KEY_COLUMN_USAGE AS i1  
    INNER JOIN 
    information_schema.REFERENTIAL_CONSTRAINTS AS i2 
    ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
    WHERE i1.REFERENCED_TABLE_NAME IS NOT NULL  
    AND  i1.TABLE_SCHEMA  ='db_name';

एक तालिका तालिका में एक विशिष्ट स्तंभ तक सीमित

AND i1.table_name = 'target_tb_name' AND i1.column_name = 'target_col_name'

3

मैंने थोड़ा बैश ऑनलाइनर लिखा जिसे आप फ्रेंडली आउटपुट पाने के लिए स्क्रिप्ट पर लिख सकते हैं:

mysql_references_to:

mysql -uUSER -pPASS -A DB_NAME -se "USE information_schema; SELECT * FROM KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = '$1' AND REFERENCED_COLUMN_NAME = 'id'\G" | sed 's/^[ \t]*//;s/[ \t]*$//' |egrep "\<TABLE_NAME|\<COLUMN_NAME" |sed 's/TABLE_NAME: /./g' |sed 's/COLUMN_NAME: //g' | paste -sd "," -| tr '.' '\n' |sed 's/,$//' |sed 's/,/./'

इसलिए निष्पादन: mysql_references_to transaccion(जहां ट्रांसकेशियन एक यादृच्छिक तालिका नाम है) इस तरह से एक आउटपुट देता है:

carrito_transaccion.transaccion_id
comanda_detalle.transaccion_id
comanda_detalle_devolucion.transaccion_positiva_id
comanda_detalle_devolucion.transaccion_negativa_id
comanda_transaccion.transaccion_id
cuenta_operacion.transaccion_id
...

-4

सबसे आसान:
1. phpMyAdmin खोलें
2. डेटाबेस नाम के बाईं ओर क्लिक करें
3. शीर्ष दाएं कोने पर "डिज़ाइनर" टैब ढूंढें

सभी बाधाओं को वहां दिखाया जाएगा।

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