2009-04-30 5 views
199

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

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`) 
) 

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

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

यह प्रश्न मुझे कई अवसरों पर मदद कर रहा है। काश मैं इसे एक से अधिक बार वोट दे सकता हूं! – iGbanam

उत्तर

12

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

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

306

ये रहा:

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

क्या यह रिकर्सिव किया जा सकता है? –

+0

बहुत बहुत धन्यवाद! बहुत उपयोगी ... –

+0

thks .. यह काम किया! – htobon

45

MySQL 5.5 संदर्भ मैनुअल : "InnoDB and FOREIGN KEY Constraints"

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

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

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

मैं एक छोटे से बैश onliner कि आप एक स्क्रिप्ट लिख सकते हैं पाने के लिए लिखा था एक दोस्ताना उत्पादन:

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/,/./' 

तो निष्पादन:

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 
... 
1

वर्णन

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

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

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

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

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

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