MySQL获取数据库每个表的行数

来源:互联网 发布:和重庆网络广播电视台 编辑:程序博客网 时间:2024/06/05 23:40

这个问题的起因,是我要进行数据库数据的迁移,迁移后确定数据是否都迁移成功而遇到的。

对于数据库的迁移,我是使用MySQL官方的数据库管理工具MySQL Workbench完成的。源数据库和目标数据库都使用MySQL Workbench连接上去。下面以测试数据库为例讲讲过程。(如果不想看我废话,想直接查看怎样获取数据库/表记录数的同学,请直接翻到“四、获取数据库每个表的行数”和“ 五、获取数据库总行数”吧 ^_^)

一、从源数据库导出数据到本地

在MySQL Workbench中,通过“Server”-“Data Export”进入数据导出功能页: 
数据导出功能 
在左边选择要导出的数据库(多选),同时可以在右边选择该数据库下需要导出的表(多选),其余选项根据自己需要自行选择,我只选了“Include Create Schema”,添加用于生成数据库的SQL语句。最后点击“Start Export”开始导出即可。 
从软件显示的log中可以看到,实际是执行了mysqldump来进行数据导出的:

Running: mysqldump.exe --defaults-file="c:\users\lzm\appdata\local\temp\tmp07fpyy.cnf"  --user=root --host=127.0.0.1 --protocol=tcp --port=3306 --default-character-set=utf8 --skip-triggers "phalcon_invo"
  • 1

二、在目标数据库导入数据

与导出数据类似,在MySQL Workbench中,通过“Server”-“Data Import”进入数据导入功能页: 
数据导入功能 
由于我们导出的时候,选择了“Self-Contained File”,所以这里也勾选上这项,其他的默认即可,点击“Start Import”进行导入。同样的,也可以通过log看到MySQL Workbench干了什么:

Running: mysql.exe --defaults-file="c:\users\lzm\appdata\local\temp\tmp7yfvll.cnf"  --protocol=tcp --host=127.0.0.1 --user=root --port=3306 --default-character-set=utf8 --comments  < "C:\\Users\\lzm\\Documents\\dumps\\Dump20160818-2.sql"
  • 1

三、检验数据是否迁移成功

这里可以利用MySQL Workbench查看数据库信息,如下图: 
Schema Info 
如图,数据指到要查看的数据库上,点击出现的“I”图标,就可以显示这个数据库的相关信息,其中最后一项“Database Size(rough estimate)”即是数据库的大小。在我的实际数据库中,源数据库显示的是1.5G,而目标数据库显示的却只有847MB。 
此外,还可以切换到“Tables”选项卡,查看各个表的信息: 
Schema Tables 
注意到其中有一项“Rows”,显示了每个表的行数,这里有不少表在源数据库和目标数据库显示的行数也是不同的。这两个地方让我一度以为迁移失败了。直到我一不小心执行了select count(*) from xxx,竟意外的发现结果是相同的,在MySQL Workbench中看到的行数虽然不同,但是通过SQL查询出来的结果是相同的。于是,为了确定是否所有表都相同,就引出了今天的问题:MySQL获取数据库每个表的行数。

四、获取数据库每个表的行数

方法1.利用INFORMATION_SCHEMA.TABLES 表

对这个没有深入去了解,只知道这个表是在MySQL中默认存在的,包含了各个数据库以及各个表的各种信息,具体可以参考官方文档。具体的用法就是

select table_name,table_rows from information_schema.tables where TABLE_SCHEMA = 'phalcon_invo' order by table_rows desc
  • 1

看到结果的我惊呆了,发现这不正和“三”中在MySQL Workbench中看到的数据一样吗?也是不正确的!上网查了一下,看到有说法说,“对于InnoDB表,table_rows行计数仅是大概估计值。”到了这里,顺便也发现了MySQL Workbench的数据库大小信息以及每个表的行数其实都是通过 INFORMATION_SCHEMA.TABLES中的“DATA_LENGTH”和“TABLE_ROWS”字段实现的(PS:后来仔细看发现人家MySQL Workbench显示数据库大小那里特意用括号标注了“rough estimate”,即“粗略估计”,只怪我英语不好,一开始被我直接无视掉了。。。)。既然这个方法行不通,那我们只能老老实实的通过select count(*) from xxx来查看了。

方法2.批量查找各表的行数

虽然要通过select count(*) from xxx来查看,但我们也不能自己手动把xxx替换成每个表呀,那不得累死了!虽然上面的INFORMATION_SCHEMA.TABLES中的“DATA_LENGTH”和“TABLE_ROWS”并不可靠,但是它的“TABLE_NAME”还是可靠的,所以我们就要利用这个字段,获取每个表的名字,然后批量构造出查询的SQL语句,就可以大大减轻我们的负担啦! 
a.构造SQL语句

select concat(    'select "',    TABLE_name,    '", count(*) from ',    TABLE_SCHEMA,    '.',    TABLE_name,    ' union all') from information_schema.tableswhere TABLE_SCHEMA='phalcon_invo';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

执行后,我们便获得了构造好的SQL语句了,如图: 
make sql 
一个Ctrl + a ,复制中间的查询结果备用。 
b.执行查询 
粘贴上一步复制的SQL语句,并去掉最后的一个“union all”:

select "companies", count(*) from phalcon_invo.companies union allselect "contact", count(*) from phalcon_invo.contact union allselect "product_types", count(*) from phalcon_invo.product_types union allselect "products", count(*) from phalcon_invo.products union allselect "users", count(*) from phalcon_invo.users
  • 1
  • 2
  • 3
  • 4
  • 5

再执行语句就可以啦: 
query 
大功告成!

五、获取数据库总行数

上面的方法已经可以获取某个数据库里每个表的行数了,但如果你只关心总行数的话,还要把它们加起来,这就比较麻烦了。所以再补充一个直接获取总行数的方法,和上面的方法很相似,也是分两步,构造SQL和执行查询,只不过构造SQL的时候用一个sum语句来包住就可以了。 
a.构造SQL语句

select 'select sum(count) as total_rows from (' union allselect concat(    'select "',    TABLE_name,    '", count(*) as count from ',    TABLE_SCHEMA,    '.',    TABLE_name,    ' union all') from information_schema.tableswhere TABLE_SCHEMA='mewme_address' union allselect ') as total'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

b.执行查询 
粘贴上一步复制的SQL语句,并去掉最后的一个“union all”:

select sum(count) as total_rows from (select "companies", count(*) as count from phalcon_invo.companies union allselect "contact", count(*) as count from phalcon_invo.contact union allselect "product_types", count(*) as count from phalcon_invo.product_types union allselect "products", count(*) as count from phalcon_invo.products union allselect "users", count(*) as count from phalcon_invo.users) as total
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这样就省事许多啦!

参考文章: 
mysql中查看数据库中所有表的记录

from: http://blog.csdn.net/call_me_lzm/article/details/52244162

阅读全文
0 0
原创粉丝点击