如何在mysql中获取表的外键

时间:2010-11-11 22:42:15

标签: php mysql database foreign-keys parent-child

我正在创建一个类,它从数据库中获取一个表,并将其显示到一个网页,尽可能多地提供功能。我想支持的一件事就是让类检测表中的哪些列对它们有外键约束,以便它可以转到那些表,获取它们的所有值并在select中使用它们编辑这些字段时调用的-box,以避免某人违反外键约束,

主要问题是发现哪些字段对它们有外键约束,以及它们指向哪些表。有谁知道怎么做???

谢谢,

Lemiant

4 个答案:

答案 0 :(得分:11)

获取给定表的外键的简单方法:

SELECT
    `column_name`, 
    `referenced_table_schema` AS foreign_db, 
    `referenced_table_name` AS foreign_table, 
    `referenced_column_name`  AS foreign_column 
FROM
    `information_schema`.`KEY_COLUMN_USAGE`
WHERE
    `constraint_schema` = SCHEMA()
AND
    `table_name` = 'your-table-name-here'
AND
    `referenced_column_name` IS NOT NULL
ORDER BY
    `column_name`;

答案 1 :(得分:3)

INFORMATION_SCHEMA数据库包含所有其他数据库的完整模式的详细信息,包括约束:

http://dev.mysql.com/doc/refman/5.0/en/information-schema.html

您还可以运行SHOW CREATE TABLE查询以使SQL创建表,包括其约束。

答案 2 :(得分:0)

可以从MySQL的information_schema检索很多,包括外键,如dev-null-dweller所指出。

1

SELECT * FROM information_schema.table_constraints 
         WHERE table_schema = 'dbname' AND table_name='mytable';

而不是dbname使用函数SCHEMA()USE中设置数据库的名称。


2

正如Dan Grossman指出的那样,命令

SHOW CREATE TABLE `yourtablename`

基本上可以用来获取create table语句的SQL转储。


〜3

MySQL提供了一个SHOW KEYS命令。因此,如果您知道较低的基数阈值并且表中的其他键很少,理论上您可以获得FK。

SHOW KEYS FROM `address` WHERE Non_unique AND CARDINALITY > 10000

由于每次更改内部数据库时密钥的基数都会发生变化,因此这是理论上的。例如,在运行ANALYZE TABLE时查看基数更改。


〜4

坚持命名架构很有用,例如foreigntablename_foreignfieldname。例如,表user_id中的字段billing。大型Web内容框架的几个ORM使用此模式。

答案 3 :(得分:0)

基于this other thread中的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