与this question类似,但对于MySQL ....
如何以编程方式确定MySQL中的外键引用(假设InnoDB)?我几乎能得到它们:
SHOW TABLE STATUS WHERE Name = 'MyTableName';
...但是,唉,似乎包含一些此信息的注释列被截断,所以我不能依赖它。必须有其他方式......
我对C API调用,SQL语句,任何事情感到满意 - 我只需要能够始终如一的东西。
注意:我还考虑过解析“SHOW CREATE TABLE MyTableName”语句的结果,但我真的希望有更简单的东西。
答案 0 :(得分:29)
您可以查询两个表格来获取此信息:INFORMATION_SCHEMA.TABLE_CONSTRAINTS
和INFORMATION_SCHEMA.KEY_COLUMN_USAGE
。
以下是上面链接的后一页评论的查询,其中演示了如何获取您所寻求的信息。
SELECT CONCAT( table_name, '.', column_name, ' -> ',
referenced_table_name, '.', referenced_column_name ) AS list_of_fks
FROM INFORMATION_SCHEMA.key_column_usage
WHERE referenced_table_schema = 'test'
AND referenced_table_name IS NOT NULL
ORDER BY table_name, column_name;
使用您的架构名称而不是上面的“test
”。
答案 1 :(得分:7)
在这里,您对@bill解决方案有一些改进:
SELECT CONSTRAINT_SCHEMA AS db,
CONCAT (
TABLE_NAME,
'.',
COLUMN_NAME,
' -> ',
REFERENCED_TABLE_NAME,
'.',
REFERENCED_COLUMN_NAME
) AS relationship
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'your_table_name'
ORDER BY CONSTRAINT_SCHEMA,
TABLE_NAME,
COLUMN_NAME;
在这种情况下,我通过与“your_table_name”字段的关系进行过滤,并查看关系来自哪个数据库。
答案 2 :(得分:2)
尝试INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
答案 3 :(得分:0)
基于Bill Karwin的回答,我使用此解决方案来获取所需的所有信息,包括on_delete和on_update规则:
SELECT kcu.referenced_table_schema, kcu.constraint_name, kcu.table_name, kcu.column_name, kcu.referenced_table_name, kcu.referenced_column_name,
rc.update_rule, rc.delete_rule
FROM INFORMATION_SCHEMA.key_column_usage kcu
JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc on kcu.constraint_name = rc.constraint_name
WHERE kcu.referenced_table_schema = 'db_name'
AND kcu.referenced_table_name IS NOT NULL
ORDER BY kcu.table_name, kcu.column_name
答案 4 :(得分:-1)
SELECT TABLE_NAME,
COLUMN_NAME,
CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'table_name'
AND TABLE_SCHEMA = 'table_schema';