我的问题是关于外键。例如,我们有X表X和X_PK,表A,B,C有空A_FK_X和空B_FK_X。表C不包含表X的FK。表A已经有A_FK_X已初始化的记录,但表B没有。如何在整个数据库中识别对主键的所有外键引用?
是否可以在所有表中找到指定X_PK的所有用法?
我的问题是关于外键。例如,我们有X表X和X_PK,表A,B,C有空A_FK_X和空B_FK_X。表C不包含表X的FK。表A已经有A_FK_X已初始化的记录,但表B没有。如何在整个数据库中识别对主键的所有外键引用?
是否可以在所有表中找到指定X_PK的所有用法?
您想使用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
的引用的数据库,但输出将根据您的数据库/表结构而有所不同。
太棒了!但是,例如,如果我们有X_PK = 5,并且在表A中有两条记录,A_FK_X = 5,而表B不包含相似的记录。是否有可能从表A中找到2条记录?或者只是定义整个数据库中相似记录的数量? – oaleynik 2012-07-26 11:03:57
您可以使用存储过程和预处理语句来实现这一点,但我强烈建议1)使用上述查询获取结果行,2)在前端遍历它们以获取表名和列名,然后3)用这些表和列名以及相关的WHERE条款构建查询。不过,该代码取决于您的前端。 – 2012-07-26 11:22:39
,你可以去下面的查询:
选择constraint_schema,constraint_name命令,表名,列名,referenced_table_name,referenced_column_name 从information_schema.key_column_usage
可能重复? ](http://stackoverflow.com/questions/201621/how-do-i-see-all-foreign-keys-to-a-table-or-column) – 2012-07-26 11:14:49