Mysql 是不是与 mssql 中的 @@ROWCOUNT 等效?

Posted

技术标签:

【中文标题】Mysql 是不是与 mssql 中的 @@ROWCOUNT 等效?【英文标题】:Does Mysql have an equivalent to @@ROWCOUNT like in mssql?Mysql 是否与 mssql 中的 @@ROWCOUNT 等效? 【发布时间】:2011-01-14 19:30:20 【问题描述】:

如何像@@ROWCOUNT 在 mssql 中那样在 mysql 中获取行计数值?

【问题讨论】:

【参考方案1】:

计算 where 子句中子查询的行数。然后测试总行数是否大于零。

选择客户编号, 顾客姓名, 信用额度 来自客户 其中 (SELECT count(*) as tot 来自客户) > 0;

【讨论】:

【参考方案2】:

还有一种方法:

CREATE TEMPORARY TABLE `results` AS ( *** Your query without LIMIT *** );

获取行数

SELECT COUNT(*) FROM `results`;

获取您的子集

SELECT * FROM `results` LIMIT 5,10;

临时表只存在于当前会话中。之后我仍然会清理

DROP TEMPORARY TABLE `results`;

【讨论】:

您能解释一下您的解决方案相对于其他旧解决方案的优势吗?或者让我给你一个场景,你有一个包含 600 万条记录的表,每秒添加 15 条新记录并更新另外 10 条记录。现在您想运行查询,将其结果复制到另一个表,然后计算这些结果,然后删除该临时表?除非您有很强的备份能力,否则我认为您的解决方案充其量是浪费服务器资源。跨度> @AaA 实际上它以 RAM 为代价节省了处理。 SELECT COUNT(*) FROM table 速度特别快,并且消除了重复查询复杂性的成本。如果您可以持久保存临时表,直到它不再以某种方式不再使用,它​​还可以为您节省后续分页的成本 @GaretClaborn,您已经在运行一个查询来过滤您的记录并将其写入一个外部表,该表很可能不会因为它的大小而位于内存中(请参阅我的场景),然后您的几秒钟后查询结果无效,因为会有新记录。此外,由于临时表仅用于同一个会话,如果您要处理来自多个客户端的数据,您将需要一台非常高端的服务器机器(即使在 mySQL 集群中) @AaA 工作负载包含不经常更新的导入数据更为常见。您的情况比OP问题要窄得多;例如,每 15 分钟更新数百万条记录是我工作中的常见场景。在这两种情况下,实际计数都更快并节省了处理时间。尽管在我的情况下,交易可以节省额外的成本。此外,RAM 很便宜。即使是 Digital Ocean 最便宜的 RAM 优化 Droplet 也可以轻松处理内存中的 600 万行。 digitalocean.com/pricing/#memory-optimized-droplets @AaA 在我的用例中是有意义的,因为我也会对临时数据运行其他查询。创建临时表不一定是正确的解决方案。顺便说一句,这段代码比 FOUND_ROWS() 更便携。【参考方案3】:

对于 SELECT,您可以使用 FOUND_ROWS 构造 (documented here):

SELECT SQL_CALC_FOUND_ROWS something FROM your_table WHERE whatever;
SELECT FOUND_ROWS( ) ;

这将返回最后一个SELECT 查询中的行数(或者如果第一个查询有LIMIT 子句,它会返回没有LIMIT 的行数)。

对于UPDATE/DELETE/INSERT,它是ROW_COUNT 构造

INSERT INTO your_table VALUES (1,2,3);
SELECT ROW_COUNT();

这将返回受影响的行数。

【讨论】:

@@ROWCOUNT 有助于在执行选择后获得值 - 这就是我想要的;然后通过返回的总行数在存储过程中做进一步的计算 抱歉,一定是搞错了。编辑了我的答案。 >它返回没有 LIMIT 的行数 来自文档:在没有 SQL_CALC_FOUND_ROWS 选项 (...) 的情况下,FOUND_ROWS() 返回该语句返回的结果集中的行数。如果语句包含 LIMIT 子句,则 FOUND_ROWS() 返回达到限制的行数。 是的,但在 Oracle 中,您可以这样做:从行数 > 100 的 myTable 中删除。这将删除除前 100 行之外的所有内容。如何使用 mySql 在单个 SQL 语句中执行此操作?仅供参考,mySQl 不支持子查询中的 LIMIT,所以你不能说 delete from myTable where id not in (select * LIMIT 0, 100) ?【参考方案4】:

最简单的方法是使用变量:

mysql> SELECT @rowcount:=COUNT(*) FROM my_table;
mysql> SELECT @rowcount;

或者您可以在将 SQL_CALC_FOUND_ROWS 放入 SELECT 语句后使用 FOUND_ROWS() 构造。

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM my_table;
mysql> SELECT FOUND_ROWS();

【讨论】:

【参考方案5】:
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name

    -> WHERE id > 100 LIMIT 10;

mysql> SELECT FOUND_ROWS();

阅读更多关于这个here

【讨论】:

以上是关于Mysql 是不是与 mssql 中的 @@ROWCOUNT 等效?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL与MSSQL的区别及优劣比较?

MSSQL sql server 2005/2008 row_number()函数应用之–删除表中重

mysql语句与sql语句的基本区别

是否有可能使 Debezium 引擎与具有 binglog_format 作为 MIXED 而不是 ROW 的 mysql 一起工作

Mssql 2012 与 PHP & Mysql 到 Mssql 迁移

MSSQL 到 MySQL 数据库迁移