2014-08-28 114 views
2

外键我有两个问题,我需要帮助:查询找到数据库架构

  1. 我想有一个显示在一个模式中的表外键关系的查询。我的整个目标是找出模式中的表是否声明了外键,以在模式中的表之间建立关系。例如,如果开发人员声明,使用“show crate table”将在表上显示外键。我试图使用“显示表​​状态”,并期望在评论栏中看到外键关系,但事实并非如此。无论如何,是否有一个查询可以用来检查模式中的表之间的外键关系?

  2. 什么是我可以用来执行数据库分析的好查询?我得到了一个我需要分析的旧数据库,所以我们可以改进它的设计和结构。

谢谢。

+0

查看information_schema数据库,您会在该表中找到一些有用的信息。包括钥匙。 – 2014-08-28 11:43:21

+0

如果这用于分析您继承的数据库,为什么不使用SQLYog或类似的可视化工具?把几周的工作花费几分钟。 – 2014-08-28 11:43:37

回答

3

您可以使用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或唯一约束的信息也很有用。

+0

嗨,阿尔玛。这正是我所期待的。感谢大家提供建议。还有一个问题,如果一个数据库没有任何外键,它可以被认为是“关系型”的?如果有一个数据库没有任何参照完整性,有哪些优点? – 2014-08-28 14:29:54

+0

我接管的模式有大约1000个表,并且使用上面提供的查询,模式不使用任何外键。这是一个很好的设计,不使用外键或参照完整性?这种类型的设计在什么情况下会是想法? – 2014-08-28 15:32:39

+0

那么,我建议你在单独的问题中提出问题 - 因为即使它与收集这种信息的方法有关,它也是基本的设计问题 – 2014-08-28 15:33:36