14

类似于这个问题,但对于 MySQL....

如何以编程方式确定 MySQL 中的外键引用(假设 InnoDB)?我几乎可以得到它们:

SHOW TABLE STATUS WHERE Name = 'MyTableName';

...但是,唉,似乎包含其中一些信息的评论栏被截断了,所以我不能依赖它。一定有别的办法...

我会对 C API 调用、SQL 语句以及任何东西感到满意——我只需要能够始终如一地工作的东西。

注意:我也考虑过解析“SHOW CREATE TABLE MyTableName”语句的结果,但我真的希望有更简单的东西。

4

5 回答 5

29

您可以查询两个表来获取此信息:INFORMATION_SCHEMA.TABLE_CONSTRAINTSINFORMATION_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上面的 ' '。

于 2008-11-07T22:51:23.980 回答
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”字段的关系进行过滤,并查看关系来自哪个数据库。

于 2012-08-08T08:36:06.200 回答
2

尝试INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

于 2008-11-07T22:12:46.163 回答
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
于 2020-02-24T18:07:34.897 回答
-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';
于 2016-05-31T11:59:20.460 回答