如何选择所有带有一定数量外键的表?

时间:2019-05-15 09:04:03

标签: mysql sql mysql-workbench

如何从数据库中选择所有表,例如其中有一个外键?关于外键的数量,我还可以升序获取数据库中的所有表吗? 谢谢!

我确实发现了如何获取一个特定表的外键。但是,如何在所有表上迭代这样的查询?

USE INFORMATION_SCHEMA;
SELECT TABLE_NAME,
       COLUMN_NAME,
       CONSTRAINT_NAME,
       REFERENCED_TABLE_NAME,
       REFERENCED_COLUMN_NAME
FROM KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = "<database_name>" 
      AND TABLE_NAME = "<table_name>" 
      AND REFERENCED_COLUMN_NAME IS NOT NULL;

是否还可以通过计数外键来选择?

谢谢!

3 个答案:

答案 0 :(得分:0)

对您的目标数据库运行此查询。请确保查询通过手动检查返回正确的数据,然后再依赖它:)

SELECT [Table Name],COUNT(*)
FROM 
(
    SELECT fk_tab.name as [Table Name],
    fk.name [FK_Name]
    FROM sys.foreign_keys fk
    INNER JOIN sys.tables fk_tab
    ON fk_tab.object_id = fk.parent_object_id
)A
GROUP BY [Table Name]
ORDER BY COUNT(*) DESC

对于MySQL,请您尝试一下。我只是从Here

复制了它
select concat(fks.constraint_schema, '.', fks.table_name) as foreign_table,
       '->' as rel,
       concat(fks.unique_constraint_schema, '.', fks.referenced_table_name)
              as primary_table,
       fks.constraint_name,
       group_concat(kcu.column_name
            order by position_in_unique_constraint separator ', ') 
             as fk_columns
from information_schema.referential_constraints fks
join information_schema.key_column_usage kcu
     on fks.constraint_schema = kcu.table_schema
     and fks.table_name = kcu.table_name
     and fks.constraint_name = kcu.constraint_name
group by fks.constraint_schema,
         fks.table_name,
         fks.unique_constraint_schema,
         fks.referenced_table_name,
         fks.constraint_name
order by fks.constraint_schema,
         fks.table_name;

答案 1 :(得分:0)

您似乎想要一个简单的聚合查询:

SELECT TABLE_NAME, COUNT(*)
FROM KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = "<database_name>" AND
      REFERENCED_COLUMN_NAME IS NOT NULL
GROUP BY TABLE_NAME;

但是,这是在计算具有声明的外键关系的列数。它不计算外键的数量,因为两列可用于单个外键关系。

尚不清楚您真正要做什么,因此也许此查询确实可以满足您的要求。

答案 2 :(得分:0)

有人可以帮助解决这个问题吗?尚未得到答复(以我可以解决问题的方式)。 要指定问题:

我想将数据从一个数据库迁移到另一个数据库。我想从表中外键的数量最少的实体开始(甚至零,这些实体将最容易迁移)。