【问题标题】:How can I get the foreign keys of a table in mysql如何在mysql中获取表的外键
【发布时间】:2010-11-11 22:42:14
【问题描述】:

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

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

谢谢,

勒芒

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢,正是我要找的东西
  • table_schema = DATABASE() 用于当前连接的数据库。
  • 我没有得到 constraint_schema = SCHEMA() 部分,constraint_schema 只是约束的名称,对吗?它应该是 table_schema = 'your-db-name-here'
【解决方案2】:

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

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

您还可以运行 SHOW CREATE TABLE 查询以获取用于创建表的 SQL,包括其约束。

【讨论】:

  • 补充一点,FK 信息仅在使用 InnoDB 存储的表上可用。来自手册:For storage engines other than InnoDB, MySQL Server parses the FOREIGN KEY syntax in CREATE TABLE statements, but does not use or store it.
  • 谢谢,SHOW CREATE TABLE tableName 显示了所有需要的信息!
【解决方案3】:

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

1

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

使用函数SCHEMA()代替dbname,在USE中设置数据库的名称。


2

正如 Dan Grossman 所指出的,命令

SHOW CREATE TABLE `yourtablename`

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


~3

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

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

每次更改内部数据库时,密钥的基数都会发生变化,这是相当理论上的。例如,通过运行 ANALYZE TABLE 查看基数变化。


~4

坚持使用命名模式很有用,例如foreigntablename_foreignfieldname。例如,表 billing 中的字段 user_id。一些大型 Web 内容框架的 ORM 使用这种模式。

【讨论】:

    【解决方案4】:

    根据 Bill Karwin 在 this other thread 中的回答,我使用此解决方案获取了我需要的所有信息,包括 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2021-11-03
      • 2010-10-02
      • 2014-06-23
      • 2015-06-17
      相关资源
      最近更新 更多