Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:如何以编程方式确定外键关系?_Sql_Mysql_C_Foreign Keys - Fatal编程技术网

MySQL:如何以编程方式确定外键关系?

MySQL:如何以编程方式确定外键关系?,sql,mysql,c,foreign-keys,Sql,Mysql,C,Foreign Keys,类似于MySQL,但适用于MySQL 如何以编程方式确定MySQL中的外键引用(假设为InnoDB)?我几乎可以通过以下方式获得: SHOW TABLE STATUS WHERE Name = 'MyTableName'; …但遗憾的是,似乎包含一些信息的评论栏被截断了,所以我不能依赖它。一定有别的办法 我很乐意使用一个C API调用、一个SQL语句,任何东西——我只需要一些能够持续工作的东西 注意:我也考虑过解析“SHOW CREATE TABLE MyTableName”语句的结果,但我真

类似于MySQL,但适用于MySQL

如何以编程方式确定MySQL中的外键引用(假设为InnoDB)?我几乎可以通过以下方式获得:

SHOW TABLE STATUS WHERE Name = 'MyTableName';
…但遗憾的是,似乎包含一些信息的评论栏被截断了,所以我不能依赖它。一定有别的办法

我很乐意使用一个C API调用、一个SQL语句,任何东西——我只需要一些能够持续工作的东西


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

尝试
信息\u模式。引用\u约束

可以查询两个表来获取此信息:和

下面是上面链接的后一页上的评论中的一个查询,它演示了如何获取您所寻求的信息

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
”。

这里您比@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”字段的关系进行筛选,并查看关系来自哪个数据库。

根据Bill Karwin的回答,我使用此解决方案获得了我所需的所有信息,包括关于删除和更新规则的信息:

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

我似乎没有那个表,尽管我有信息SCHEMA.table约束,它包含了我需要的大部分(但不是全部)信息。无论如何谢谢你!一个相当慢的查询<代码>/*0行受影响,找到22行。1个查询的持续时间:2996秒*/@V-Light,您有其他解决方案吗?虽然您的查询似乎有效,但请向社区提供一个关于其工作原理的小说明。