Làm cách nào để tìm tất cả các bảng có khóa ngoại tham chiếu bảng.column cụ thể và có giá trị cho các khóa ngoại đó?


272

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ụ:

  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 trong cơ sở dữ liệu chứa khóa ngoại vào X như bảng Y và Z. Có câu truy vấn SQL nào tôi có thể sử dụng để trả về:

  1. Danh sách các bảng có khóa ngoại vào X
  2. VÀ bảng nào trong số các bảng đó thực sự có giá trị trong khóa ngoại

Câu trả lời:


384

Ở đâ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 tên bảng / cột tương tự, bạn cũng có thể muốn giới hạn truy vấn của mình trong một cơ sở dữ liệu cụ thể:

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

7
CHỌN TABLE_NAME tốt hơn sau đó CHỌN *
zloctb

Đối với loại DB này là hữu ích? MySql?
Cirelli94

2
@ Cirelli94 Câu hỏi được gắn thẻ dưới dạng câu hỏi MySQL.
mikechuld

61

Tài liệu tham khảo MySQL 5.5: "Các ràng buộc chính của InnoDB và NGOẠI TỆ"

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

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

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 các bảng trong cơ sở dữ liệu cụ thể, hãy thêm vào như sau:

AND table_schema = 'database_name';

15

Bạn có thể tìm thấy tất cả các thông tin liên quan đến lược đồ trong information_schemabảng được đặt tên khôn ngoan .

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


5

Liệt kê tất cả các khóa 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';

giới hạn ở một cột cụ thể trong bảng bảng

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

3

Tôi đã viết một bash onliner nhỏ mà bạn có thể viết vào một kịch bản để có được kết quả thân thiện:

mysql numferences_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 thi: mysql_references_to transaccion(trong đó transaccion là một tên bảng ngẫu nhiên) cho ra một kết quả 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
...

-4

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

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.