在MySQL中,如何获得所有外键约束指向特定表的列表?一个特定的专栏?这和Oracle的问题是一样的,但是是MySQL的问题。
当前回答
如果你使用InnoDB并定义了FK,你可以查询information_schema数据库,例如:
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable';
其他回答
使用REFERENCED_TABLE_NAME并不总是有效,它可以是一个NULL值。下面的查询可以代替:
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '<table>';
我需要鸟瞰表之间的关系(在ORM中使用)。使用该页面的建议,经过试验,我整理了以下查询:
SELECT
KCU.CONSTRAINT_NAME,
KCU.TABLE_NAME,
KCU.COLUMN_NAME,
KCU.REFERENCED_TABLE_NAME,
KCU.REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU
JOIN INFORMATION_SCHEMA.COLUMNS AS COLS
ON
COLS.TABLE_SCHEMA = KCU.TABLE_SCHEMA
AND COLS.TABLE_NAME = KCU.TABLE_NAME
AND COLS.COLUMN_NAME = KCU.COLUMN_NAME
WHERE
KCU.CONSTRAINT_SCHEMA = {YOUR_SCHEMA_NAME}
AND KCU.REFERENCED_TABLE_NAME IS NOT NULL
ORDER BY
KCU.TABLE_NAME,
COLS.ORDINAL_POSITION
它只返回我需要的东西,而且是按照我想要的顺序。
我还对结果做了一些处理(将其转换为某种字典),以便它可以用于创建聚合。
在旧的答案上添加一些有用的信息。
我遇到了类似的问题,但我还想查看CONSTRAINT_TYPE以及引用的表和列名。所以,
To see all FKs in your table: USE '<yourschema>'; SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME FROM information_schema.TABLE_CONSTRAINTS i LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY' AND i.TABLE_SCHEMA = DATABASE() AND i.TABLE_NAME = '<yourtable>'; To see all the tables and FKs in your schema: USE '<yourschema>'; SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME FROM information_schema.TABLE_CONSTRAINTS i LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY' AND i.TABLE_SCHEMA = DATABASE(); To see all the FKs in your database: SELECT i.TABLE_SCHEMA, i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME FROM information_schema.TABLE_CONSTRAINTS i LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY';
记住!
这里使用的是InnoDB存储引擎。如果在添加外键后,似乎无法显示任何外键,这可能是因为您的表正在使用MyISAM。
检查:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
要修复,使用这个:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
我有一个“myprodb”MySql数据库,为了检查这个数据库中的所有外键,我使用了以下简单的命令。
select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_SCHEMA = 'myprodb' AND CONSTRAINT_TYPE = 'FOREIGN KEY';
我希望它能有所帮助。
我不愿意再添加另一个答案,但我必须从其他人那里乞求、借用和窃取才能得到我想要的答案,这是给定模式中表上所有FK关系的完整列表,包括其他模式中表的FK关系。两个关键的记录集是information_schema。KEY_COLUMN_USAGE和information_schema.referential_constraints。如果缺少您想要的属性,只需取消KCU的注释。RC。看看有什么空房
SELECT DISTINCT KCU.TABLE_NAME, KCU.COLUMN_NAME, REFERENCED_TABLE_SCHEMA, KCU.REFERENCED_TABLE_NAME, KCU.REFERENCED_COLUMN_NAME, UPDATE_RULE, DELETE_RULE #, KCU.*, RC.*
FROM information_schema.KEY_COLUMN_USAGE KCU
INNER JOIN information_schema.referential_constraints RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
WHERE TABLE_SCHEMA = (your schema name)
AND KCU.REFERENCED_TABLE_NAME IS NOT NULL
ORDER BY KCU.TABLE_NAME, KCU.COLUMN_NAME;