获取mysql表中所有行数_MySQL获取数据库每个表的行数

本文介绍了如何使用MySQL Workbench进行数据库迁移,并详细讲述了如何通过两种方法检查迁移后数据库每个表的行数,确保数据完整性。通过查询INFORMATION_SCHEMA.TABLES表和构造SQL语句批量获取行数,辅助验证数据迁移是否成功。
摘要由CSDN通过智能技术生成

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

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

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

在MySQL Workbench中,通过“Server”-“Data Export”进入数据导出功能页:

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

1Running: 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"

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

与导出数据类似,在MySQL Workbench中,通过“Server”-“Data Import”进入数据导入功能页:

0818b9ca8b590ca3270a3433284dd417.png  由于我们导出的时候,选择了“Self-Contained File”,所以这里也勾选上这项,其他的默认即可,点击“Start Import”进行导入。同样的,也可以通过log看到MySQL Workbench干了什么:

1Running: 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"

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

这里可以利用MySQL Workbench查看数据库信息,如下图:

0818b9ca8b590ca3270a3433284dd417.png  如图,数据指到要查看的数据库上,点击出现的“I”图标,就可以显示这个数据库的相关信息,其中最后一项“Database Size(rough estimate)”即是数据库的大小。在我的实际数据库中,源数据库显示的是1.5G,而目标数据库显示的却只有847MB。  此外,还可以切换到“Tables”选项卡,查看各个表的信息: 

0818b9ca8b590ca3270a3433284dd417.png  注意到其中有一项“Rows”,显示了每个表的行数,这里有不少表在源数据库和目标数据库显示的行数也是不同的。这两个地方让我一度以为迁移失败了。直到我一不小心执行了select count(*) from xxx,竟意外的发现结果是相同的,在MySQL Workbench中看到的行数虽然不同,但是通过SQL查询出来的结果是相同的。于是,为了确定是否所有表都相同,就引出了今天的问题:MySQL获取数据库每个表的行数。

方法1.利用INFORMATION_SCHEMA.TABLES 表

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

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

看到结果的我惊呆了,发现这不正和“三”中在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语句

1

2

3

4

5

6

7

8

9

10select concat( 'select "', TABLE_name, '", count(*) from ', TABLE_SCHEMA, '.', TABLE_name, ' union all' ) from information_schema.tables where TABLE_SCHEMA='phalcon_invo';

执行后,我们便获得了构造好的SQL语句了,如图:

0818b9ca8b590ca3270a3433284dd417.png  一个Ctrl + a ,复制中间的查询结果备用。  b.执行查询  粘贴上一步复制的SQL语句,并去掉最后的一个“union all”:

1

2

3

4

5select "companies", count(*) from phalcon_invo.companies union all select "contact", count(*) from phalcon_invo.contact union all select "product_types", count(*) from phalcon_invo.product_types union all select "products", count(*) from phalcon_invo.products union all select "users", count(*) from phalcon_invo.users

再执行语句就可以啦:

0818b9ca8b590ca3270a3433284dd417.png  大功告成!

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

1

2

3

4

5

6

7

8

9

10

11

12select 'select sum(count) as total_rows from (' union all select concat( 'select "', TABLE_name, '", count(*) as count from ', TABLE_SCHEMA, '.', TABLE_name, ' union all' ) from information_schema.tables where TABLE_SCHEMA='mewme_address' union all select ') as total'

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

1

2

3

4

5

6

7select sum(count) as total_rows from ( select "companies", count(*) as count from phalcon_invo.companies union all select "contact", count(*) as count from phalcon_invo.contact union all select "product_types", count(*) as count from phalcon_invo.product_types union all select "products", count(*) as count from phalcon_invo.products union all select "users", count(*) as count from phalcon_invo.users ) as total

这样就省事许多啦!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值