如何在整个数据库中标识主键的所有外键引用?

时间:2012-07-26 10:36:14

标签: mysql foreign-keys

我的问题是外键。例如,我们有表X和X_PK,表A,B,C有空A_FK_X和空B_FK_X。表C不包含表X的FK。表A已经初始化了A_FK_X的记录,但表B没有。

是否可以在所有表​​中找到指定X_PK的所有用法?

2 个答案:

答案 0 :(得分:1)

您想使用information_schema数据库。试试这段代码(虽然过于简单的CREATE TABLE语句):

CREATE TABLE `X` (
    `X_id` INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY  (`X_id`)
  );

  CREATE TABLE `A` (
    `A_id` INT NOT NULL AUTO_INCREMENT,
    `X_id` INT NULL,
    PRIMARY KEY  (`A_id`),
    CONSTRAINT `A_FK_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  );

CREATE TABLE `B` (
    `B_id` INT NOT NULL AUTO_INCREMENT,
    `X_id` INT NULL,
    PRIMARY KEY  (`B_id`),
    CONSTRAINT `B_FK_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  );

CREATE TABLE `C` (
  `C_id` INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`C_id`)
);

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

这将返回每个数据库中对X_id的所有引用,因此您可以通过添加TABLE_SCHEMA来缩小搜索范围:

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

在我的系统上,这些返回相同的输出,因为我只有一个包含对X_id的引用的数据库,但输出将根据您的数据库/表结构而有所不同。

答案 1 :(得分:1)

您可以进行以下查询:

选择constraint_schema,constraint_name,table_name,column_name,referenced_table_name,referenced_column_name 来自information_schema.key_column_usage