2009-04-30 35 views
199

Tôi có một bảng có khóa chính được tham chiếu trong một số bảng khác dưới dạng khóa ngoại. Ví dụ:Làm thế nào để tìm tất cả các bảng có khóa ngoài tham chiếu bảng cụ thể.column và có giá trị cho các khóa nước ngoài?

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

Bây giờ, tôi không biết có bao nhiêu bảng có trong cơ sở dữ liệu có chứa các phím nước ngoài vào X như bảng Y và Z. Có một truy vấn SQL mà tôi có thể sử dụng để quay trở lại:

  1. Một danh sách các bảng có phím nước ngoài vào X
  2. VÀ mà những bảng thực sự có giá trị trong khóa ngoại
+1

câu hỏi này giúp tôi rất nhiều lần. Tôi ước tôi có thể bỏ phiếu này nhiều hơn một lần! – iGbanam

Trả lời

12

Bạn có thể tìm thấy tất cả các thông tin giản đồ có liên quan trong một cách khôn ngoan mang tên information_schema bảng.

Bạn có thể muốn kiểm tra bảng REFERENTIAL_CONSTRAINTSKEY_COLUMN_USAGE. Trước đây cho bạn biết bảng nào được tham chiếu bởi những người khác; sau này sẽ cho bạn biết làm thế nào các lĩnh vực của họ có liên quan.

306

Ở đây bạn đi:

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

Nếu bạn có nhiều cơ sở dữ liệu với các bảng/tên cột tương tự bạn cũng có thể muốn hạn chế truy vấn của bạn đến một cơ sở dữ liệu cụ thể: Manual

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

Điều này có thể được thực hiện đệ quy không? –

+0

Cảm ơn rất nhiều! Rất hữu ích ... –

+0

thks .. nó đã hoạt động! – htobon

45

MySQL 5,5 Reference : "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

Giải pháp này sẽ không chỉ hiển thị tất cả mối quan hệ s nhưng cũng là tên ràng buộc, được yêu cầu trong một số trường hợp (ví dụ: thả constraint):

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; 

Nếu bạn muốn kiểm tra bảng trong một cơ sở dữ liệu cụ thể, thêm dòng sau:

AND table_schema = 'database_name'; 
3

tôi đã viết một chút bash onliner mà bạn có thể viết thư cho một kịch bản để có được một đầu ra thân thiện:

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

Vì vậy, việc thực hiện: mysql_references_to transaccion (nơi transaccion là một tên bảng ngẫu nhiên) cho một đầu ra như thế này:

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

Bảng liệt kê tất cả các phím nước ngoài trong một db bao gồm mô tả

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

hạn chế đến một cụ thể cột trong bảng bảng

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


1. Mở phpMyAdmin
2. Trên tên cơ sở dữ liệu nhấp chuột trái
3.Ở góc trên cùng bên phải, hãy tìm tab "Nhà thiết kế"

Tất cả các ràng buộc sẽ được hiển thị ở đó.

Các vấn đề liên quan