查询以查找数据库模式上的外键

时间:2014-08-28 11:35:00

标签: mysql sql foreign-key-relationship

我有两个问题需要帮助:

  1. 我想有一个查询,在模式中的表上显示外键关系。我的整个目标是确定模式中的表是否具有声明的外键以在模式中的表之间建立关系。例如,使用"显示包装箱表"如果由开发人员声明,将在表上显示外键。我尝试使用"显示表状态"并期望在评论栏中看到外键关系,但事实并非如此。无论如何,我是否可以使用查询来检查模式中表之间的外键关系?

  2. 我可以使用哪些好的查询来对数据库进行分析?我得到了一个我需要分析的旧数据库,因此我们可以改进其设计和结构。

  3. 感谢。

1 个答案:

答案 0 :(得分:4)

您可以使用INFORMATION_SCHEMA

SELECT 
  * 
FROM  
  INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE 
  CONSTRAINT_TYPE='FOREIGN KEY'

可能的约束类型可能是:

  • PRIMARY KEY主键
  • FOREIGN KEY用于外键
  • UNIQUE了解唯一约束

所以你对FOREIGN KEY类型感兴趣。这将显示哪个列具有约束的哪个表,但不会显示目标约束列和表。要找到它们,您需要使用具有此类信息的另一个表INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS,因此,基本上,要重建表之间的关系,您需要:

SELECT 
  t.TABLE_SCHEMA, 
  t.TABLE_NAME, 
  r.REFERENCED_TABLE_NAME 
FROM  
  INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS t 
    JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS r 
    ON t.CONSTRAINT_NAME=r.CONSTRAINT_NAME 
WHERE 
  t.CONSTRAINT_TYPE='FOREIGN KEY'

但是,这又是缺少列(因为它不属于那些表),并且只会在表之间通过FK显示关系。要重建完整关系(即涉及列),您需要参考KEY_COLUMN_USAGE表:

SELECT 
  TABLE_SCHEMA, 
  TABLE_NAME, 
  COLUMN_NAME, 
  REFERENCED_TABLE_SCHEMA, 
  REFERENCED_TABLE_NAME, 
  REFERENCED_COLUMN_NAME 
FROM 
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE 
  REFERENCED_TABLE_SCHEMA IS NOT NULL

此查询将显示所引用实体不为空的所有关系,并且,因为它仅适用于FK情况 - 它是找到FK关系问题的答案。它非常普遍,但我提供了上述方法,因为获取有关PK或唯一约束的信息可能也很有用。