2012-07-26 54 views
1

我的问题是关于外键。例如,我们有X表X和X_PK,表A,B,C有空A_FK_X和空B_FK_X。表C不包含表X的FK。表A已经有A_FK_X已初始化的记录,但表B没有。如何在整个数据库中识别对主键的所有外键引用?

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

+1

可能重复? ](http://stackoverflow.com/questions/201621/how-do-i-see-all-foreign-keys-to-a-table-or-column) – 2012-07-26 11:14:49

回答

1

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

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

在我的系统:

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

这将包括TABLE_SCHEMA所有引用返回X_id在每个数据库中,这样你就可以缩小搜索范围,这些返回相同的输出,因为我只有一个包含X_id的引用的数据库,但输出将根据您的数据库/表结构而有所不同。

+0

太棒了!但是,例如,如果我们有X_PK = 5,并且在表A中有两条记录,A_FK_X = 5,而表B不包含相似的记录。是否有可能从表A中找到2条记录?或者只是定义整个数据库中相似记录的数量? – oaleynik 2012-07-26 11:03:57

+0

您可以使用存储过程和预处理语句来实现这一点,但我强烈建议1)使用上述查询获取结果行,2)在前端遍历它们以获取表名和列名,然后3)用这些表和列名以及相关的WHERE条款构建查询。不过,该代码取决于您的前端。 – 2012-07-26 11:22:39

1

,你可以去下面的查询:

选择constraint_schema,constraint_name命令,表名,列名,referenced_table_name,referenced_column_name 从information_schema.key_column_usage

的[我如何才能看到所有外键的表或列
相关问题