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 等效?的主要内容,如果未能解决你的问题,请参考以下文章
MSSQL sql server 2005/2008 row_number()函数应用之–删除表中重
是否有可能使 Debezium 引擎与具有 binglog_format 作为 MIXED 而不是 ROW 的 mysql 一起工作