Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql是否与mssql中的@行数相同?_Sql_Mysql_Stored Procedures - Fatal编程技术网

Mysql是否与mssql中的@行数相同?

Mysql是否与mssql中的@行数相同?,sql,mysql,stored-procedures,Sql,Mysql,Stored Procedures,如何在MySQL中像在mssql中一样获得@ROWCOUNT的行计数值?对于选择,您可以使用find_ROWS构造: 它将返回上一个SELECT查询中的行数,或者如果第一个查询有LIMIT子句,它将返回没有限制的行数 对于更新/删除/插入,它是构造 INSERT INTO your_table VALUES (1,2,3); SELECT ROW_COUNT(); 它将返回受影响的行数。最简单的方法是使用变量: mysql> SELECT @rowcount:=COUNT(*) FROM

如何在MySQL中像在mssql中一样获得@ROWCOUNT的行计数值?

对于选择,您可以使用find_ROWS构造:

它将返回上一个SELECT查询中的行数,或者如果第一个查询有LIMIT子句,它将返回没有限制的行数

对于更新/删除/插入,它是构造

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

它将返回受影响的行数。

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

mysql> SELECT @rowcount:=COUNT(*) FROM my_table;
mysql> SELECT @rowcount;
或者,您可以在SELECT语句中放入SQL\U CALC\U FOUND\U ROWS后使用FOUND\U ROWS构造

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM my_table;
mysql> SELECT FOUND_ROWS();
阅读更多有关此的信息

还有另一种方法:

CREATE TEMPORARY TABLE `results` AS ( *** Your query without LIMIT *** );
获取行计数

SELECT COUNT(*) FROM `results`;
得到你的子集

SELECT * FROM `results` LIMIT 5,10;
临时表仅存在于当前会话中。之后我仍然会清理

DROP TEMPORARY TABLE `results`;

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

选择customerNumber, 客户名称, 信用额度 来自客户 其中选择count*as tot
来自>0的客户

@@ROWCOUNT有助于在执行select后获得值-这正是我想要的;然后在存储过程中进一步计算返回的总行数抱歉,一定是弄错了。编辑了我的答案。>它返回没有文档限制的行数:如果没有SQL\u CALC\u FOUND\u rows选项。。。FOUND_ROWS返回该语句返回的结果集中的行数。如果语句包含LIMIT子句,则FOUND_ROWS返回达到限制的行数。是的,但在Oracle中可以这样做:从rowcount>100的myTable中删除。这将删除除前100行以外的所有内容。如何在mySql的单个SQL语句中实现这一点?仅供参考,mySQl不支持子查询中的限制,所以您不能说从myTable中删除id不在select*LIMIT 0,100中?请您解释一下您的解决方案相对于其他旧解决方案的优势?或者让我给你一个场景,你有一个有600万条记录的表,每秒添加15条新记录,另外10条正在更新。现在您想运行一个查询,将其结果复制到另一个表中,然后计算这些结果,然后删除该临时表?除非您有很强的备份能力,否则我认为您的解决方案充其量是在浪费服务器资源。@AaA实际上它以RAM为代价节省了处理。SELECT COUNT*FROM table速度特别快,消除了重复查询复杂性的成本。如果可以将临时表保留到不再使用,还可以节省后续分页的成本somehow@GaretClaborn,您已经在运行一个查询来过滤您的记录并将其写入一个外部表,该表很可能不会位于内存中,因为它的大小请参阅我的场景,然后您的查询结果在几秒钟内无效,因为将有新的记录。此外,由于temp table只用于同一个会话,如果您处理来自多个客户端的数据,那么即使在mySQL中,您也需要一台非常高端的服务器机器clusters@AaA保存导入的数据而不经常更新的工作负载更为常见。你的情景远比OP问题窄;例如,每15分钟更新数百万条记录是我工作中常见的情况。在这两种情况下,实际计数更快,节省了处理时间。虽然在我的情况下,交易可以提供额外的成本节约。此外,RAM是便宜的。即使是Digital Ocean最便宜的RAM优化液滴也可以轻松处理600万行内存@AaA在我的用例中它是有意义的,因为我也会对临时数据运行其他查询。创建临时表不一定是正确的解决方案。顺便说一句,这段代码比现有行更具可移植性。
SELECT * FROM `results` LIMIT 5,10;
DROP TEMPORARY TABLE `results`;