如何为数据库中的每个表返回(行计数,表名)的查询?

时间:2009-07-21 06:28:52

标签: sql

使用ANSI sql,我该如何进行查询 每个都返回(行数,表名) 数据库中的表?

由于 VIKI

3 个答案:

答案 0 :(得分:2)

在“ANSI”(ISO)SQL中,您必须转到“信息架构”视图才能获取信息。正式地说,这是ISO / IEC 9075-11:2003(或2008)。另请参阅SQL上的维基百科文章,其中包含:

  

SQL / Schemata,或信息和定义模式,部分由ISO / IEC 9075,第11部分定义.SQL / Schemata定义信息模式和定义模式,提供一组通用工具,使SQL数据库和对象成为自我-describing。这些工具包括SQL对象标识符,结构和完整性约束,安全和授权规范,ISO / IEC 9075的功能和包,基于SQL的DBMS实现提供的功能支持,基于SQL的DBMS实现信息和大小调整项,以及DBMS实现支持的值。标准的这一部分包含强制和可选功能。

使用一小撮盐来强制执行“强制性功能” - 我怀疑大多数DBMS甚至没有实现强制性部分。

否则,答案是特定于DBMS的。这些信息是可用的 - 详细信息从DBMS到DBMS不等,这就是全部。


SQL / Schemata(2003版)的第5.61节定义了“TABLES View”。它似乎不包括行计数,也没有我能看到的任何其他视图。所以,Beau Simensen的评论似乎是正确的;没有简单的方法可以便携地找到行计数。

CREATE VIEW TABLES AS
    SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME,
           TABLE_TYPE, SELF_REFERENCING_COLUMN_NAME, REFERENCE_GENERATION,
           USER_DEFINED_TYPE_CATALOG, USER_DEFINED_TYPE_SCHEMA,
           USER_DEFINED_TYPE_NAME, IS_INSERTABLE_INTO, IS_TYPED,
           COMMIT_ACTION
FROM DEFINITION_SCHEMA.TABLES
WHERE ( TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME ) IN
      ( SELECT TP.TABLE_CATALOG, TP.TABLE_SCHEMA, TP.TABLE_NAME
        FROM DEFINITION_SCHEMA.TABLE_PRIVILEGES AS TP
        WHERE ( TP.GRANTEE IN ( 'PUBLIC', CURRENT_USER )
                OR GRANTEE IN ( SELECT ROLE_NAMEFROM ENABLED_ROLES ) )
        UNION
        SELECT CP.TABLE_CATALOG, CP.TABLE_SCHEMA, CP.TABLE_NAME
        FROM DEFINITION_SCHEMA.COLUMN_PRIVILEGES AS CP
        WHERE ( CP.GRANTEE IN ( 'PUBLIC', CURRENT_USER )
                OR CP.GRANTEE IN ( SELECT ROLE_NAME
                                   FROM ENABLED_ROLES ) ) )
   AND TABLE_CATALOG = ( SELECT CATALOG_NAME
                         FROM INFORMATION_SCHEMA_CATALOG_NAME );

从选择列表中可以看出,行数不包括在内。

因此,我认为没有可移植的方法来确定行数和表名。

答案 1 :(得分:0)

最好的方法是编写一个从数据库元数据中提取信息的过程(Oracle - all_tables,MySql - information_schema.tables)并运行计数查询。

答案 2 :(得分:0)

我认为您无法找到适用于所有系统的方法,因为那些“目录视图”或系统视图(或任何它们被称为)通常都是特定于供应商的。

例如,对于SQL Server,您可以使用此查询进入具有所有系统视图的“sys”架构(SQL Server 2005及更高版本):

SELECT 
    t.NAME AS TableName,
    i.name as indexName,
    p.[Rows],
    sum(a.total_pages) as TotalPages, 
    sum(a.used_pages) as UsedPages, 
    sum(a.data_pages) as DataPages,
    (sum(a.total_pages) * 8) / 1024 as TotalSpaceMB, 
    (sum(a.used_pages) * 8) / 1024 as UsedSpaceMB, 
    (sum(a.data_pages) * 8) / 1024 as DataSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
    t.NAME NOT LIKE 'dt%' AND
    i.OBJECT_ID > 255 AND   
    i.index_id <= 1
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name, p.[Rows]
ORDER BY 
    object_name(i.object_id) 

但是,这当然不适用于Oracle,MySQL,PostgreSQL或IBM DB2 .......

马克