怎么用PDO得知数据库中某个表的总行数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用PDO得知数据库中某个表的总行数相关的知识,希望对你有一定的参考价值。

希望大神把代码写出来 ,小弟不胜感激

参考技术A PDO::query() 方法用在 SQL 中的 SELECT 查询上。如果该方法执行成功,那么将返回一个 PDOStatement 对象,使用 rowCount() 方法可以返回影响的行数

<?php
header('Content-Type:text/html;Charset=utf-8');
try
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '1715544');
$pdo->setAttribute(PDO::ATTR_PERSISTENT, true); // 设置数据库连接为持久连接
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 设置抛出错误
$pdo->setAttribute(PDO::ATTR_ORACLE_NULLS, true); // 设置当字符串为空转换为 SQL 的 NULL
$pdo->query('SET NAMES utf8'); // 设置数据库编码
catch (PDOException $e)
exit('数据库连接错误,错误信息:'. $e->getMessage());

$sql = "SELECT userName,email,age,addTime FROM think_user";
try
$result = $pdo->query($sql);
foreach ($result as $row)
echo $row['userName'] . "\t" . $row['email'] . "\t" .$row['age'] . "\t" .$row['addTime'] . '<br />';

echo '总共'. $result->rowCount() .'条';
catch (PDOException $e)
exit($e->getMessage());

?>本回答被提问者和网友采纳

如何在特定模式中的所有表的选择列表中获取总行数和最大(时间戳)列

【中文标题】如何在特定模式中的所有表的选择列表中获取总行数和最大(时间戳)列【英文标题】:How to get total row count and max(timestamp) column in select list for all table in particular schema 【发布时间】:2016-05-26 09:42:05 【问题描述】:

我们有基于 Postgres 的 只读 数据库。其中,我们在一个模式下有 52 个表。

我们正在尝试为一个模式下的所有表输出行数和 max(timestamp) 列。

环境是:

PostgreSQL 8.2.15 (Greenplum Database 4.2.0 build 1) (HAWQ 1.3.0.2 build 14421) on x86_64-unknown-linux-gnu, GCC 编译 gcc (GCC) 4.4.2 编译

我们试穿了:

SELECT 
  nspname AS schemaname,relname,reltuples,max(time)
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE 
  nspname NOT IN ('pg_catalog', 'information_schema') AND
  relkind='r' 
ORDER BY reltuples DESC;

在这个查询中,我们得到了行计数列,但仍然没有达到所有表的 max(timestamp)。

任何帮助将不胜感激?

【问题讨论】:

嗨 vickps 您使用的是什么时间戳格式,例如有或没有时区的时间? 使用没有时区的时间戳 【参考方案1】:

您使用此查询访问的是数据库统计信息,它不是 100% 准确的,并且可能会丢失或过时,具体取决于您的统计信息收集过程。

要获取表列表的行数,您必须扫描每个表。但是您可以使用pg_relation_size() 来了解表格大小(以字节为单位),并且此功能不需要您扫描表格。

如果您的表格列表是静态的,您可以使用这样的查询:

select 'table1', count(*), max(time) from table1
union all
select 'table2', count(*), max(time) from table2
union all
...
select 'table52', count(*), max(time) from table52;

这个方案不灵活,好像表列表变了,你需要重写你的查询。

第二个选项是生成这个查询并手动执行它:

select string_agg(query, ' union all ') as query
    from (
        select 'select ''' || n.nspname || '.' || c.relname || ''', count(*), max(time) from ' || n.nspname || '.' || c.relname as query
            from pg_namespace as n, pg_class as c
            where n.oid = c.relnamespace
                and n.nspname = 'my_schema'
        ) as q;

这样更灵活,但是第二个查询应该手动执行。

最后是你的最后一个选择——为此编写一个函数:

create or replace function table_sizes (schemaname varchar) returns setof record as $BODY$
declare
    r record;
    t varchar;
begin
    for t in execute $$
        select n.nspname || '.' || c.relname
            from pg_namespace as n, pg_class as c
            where n.oid = c.relnamespace
                and c.relkind = 'r'
                and n.nspname = '$$ || schemaname || $$'$$
    loop
        execute 'select ''' || t || '''::varchar, count(*), max(time) from ' || t
            into r;
        return next r;
    end loop;
    return;
end;
$BODY$ language plpgsql volatile;

select * from table_sizes('public') t(tablename varchar, rowcount bigint, maxtime time);

【讨论】:

当我在这里执行函数时。获得关注 :: prod=# select * from table_sizes('schemaname') t(tablename varchar, rowcount bigint, maxtime time);错误:RETURN NEXT CONTEXT 中提供的记录类型错误:PL/pgSQL 函数“table_sizes”第 14 行返回下一个 prod=# 这意味着您的“选择”语句与返回的数据类型不匹配。 “时间”字段的数据类型是什么?它应该与“选择”查询中的匹配 没有时区的时间戳 知道了。我把它改成了时间戳。查询已执行。万分感谢 。功能很棒。 另外,对于大表,我建议使用pg_relation_type 而不是计算行数。另外max(time)可以存储在“元数据”表中,该表将在更新主表的同一事务中更新,这样就不需要手动计算了【参考方案2】:

这里有一些其他的步骤:

在 psql 中执行以下步骤

\o count_per_schema.sql
select 'select count(*)as '||c.relname||', max(time) from ' || n.nspname || '.' || c.relname || ';' as " " from pg_namespace as n, pg_class as c where n.oid = c.relnamespace and c.relkind='r' and n.nspname = 'schema_name';
\o
\i count_per_schema.sql

\o 会将结果重定向到您提供的filename。例如count_per_schema.sql\i 将运行文件中的所有查询。

这是我在服务器中所做的。我没有选择 max(time)。

yogesh=# \o count_per_schema.sql
yogesh=# select 'select count(*)as '||c.relname||' from ' || n.nspname || '.' || c.relname || ';' as " " from pg_namespace as n, pg_class as c where n.oid = c.relnamespace and c.relkind='r' and n.nspname = 'public';
yogesh=# \o
yogesh=# \i count_per_schema.sql

 heap1
-------
 20000
(1 row)
 test
-------
     4
(1 row)
 users
-------
     0
(1 row)
 skew_demo
-------
 10609
(1 row)

【讨论】:

这样做的好处是你可以从输出文件中删除你不想要的表条目

以上是关于怎么用PDO得知数据库中某个表的总行数的主要内容,如果未能解决你的问题,请参考以下文章

如何在特定模式中的所有表的选择列表中获取总行数和最大(时间戳)列

PostgreSQL 统计所有数据表各自的总行数

C#的dataGridView控件里面已经有数据了,怎么让它自动统计总行数?[自动统计:没有点击等任何事件时]

在Java中,如何通过在数据库得到的结果集得到表的列数和行数?

primefaces 中 如何得到表格的总行数

php+mysql 请问:用pdo如何获取某个表中记录的数目?