首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否有一个命令可以在不执行SQL查询的情况下测试它?( MySQL或ANSI SQL )

是否有一个命令可以在不执行SQL查询的情况下测试它?( MySQL或ANSI SQL )
EN

Stack Overflow用户
提问于 2010-03-12 23:13:30
回答 7查看 61.6K关注 0票数 31

有没有这样的东西:

TEST DELETE FROM user WHERE somekey = 45;

这可能会返回任何错误,例如某个键不存在,或某些约束违反或任何东西,并报告有多少行将受到影响,但不执行查询?

我知道您可以很容易地将select查询中的任何查询转换为在任何行中没有写入或删除效果的查询,但这可能会导致错误,如果您想要测试和调试许多查询,这是不太实际的。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2018-06-08 18:52:58

我意识到这是一个有点老生常谈的问题,但为了完整性...

如果其目的是在不返回任何行的情况下找到查询处理时间(我经常需要这样做,我想知道我正在使用的一段代码将花费多长时间,而不返回我不感兴趣看到的几百万行),那么黑洞引擎可能非常有用:

https://dev.mysql.com/doc/refman/8.0/en/blackhole-storage-engine.html

例如,假设我有两个表,t1 & t2,有数百万行,我将它们连接在一起。我想在图形用户界面(SQLYog或mysql工作台等)中检查这可能需要多长时间,而不返回数以百万计的行,这将消耗内存,并可能需要图形用户界面处理和显示的时间。我使用黑洞引擎将行“转储”到任何地方。例如:

代码语言:javascript
复制
CREATE TABLE tBH (a TINYINT) ENGINE = BLACKHOLE;
SELECT NOW(); -- Show start time
INSERT tBH 
SELECT 1 FROM t1
LEFT JOIN t2 ON t1.key1 = t2.key1;
SELECT NOW(); -- Show end time

请注意,由于我只是在寻找执行时间,所以我不会费心返回所有列(IE带有"*"),而只返回一个占位符(在本例中为“1”)。

票数 2
EN

Stack Overflow用户

发布于 2010-03-12 23:16:06

我所知道的唯一一件事就是将它包装在一个总是回滚的事务中:

代码语言:javascript
复制
BEGIN TRANSACTION

DELETE FROM user WHERE somekey = 45;

ROLLBACK TRANSACTION

确保执行整个代码块,而不仅仅是delete语句。此外,不要在任何生产环境或任何您不能丢失数据的系统上运行此命令。

票数 53
EN

Stack Overflow用户

发布于 2018-12-11 03:56:19

从MySQL 5.6开始,EXPLAIN关键字可用于SELECTDELETEINSERTREPLACEUPDATE语句。

如果您的查询有语法错误,那么它仍然会失败,但是如果成功,您将只看到EXPLAIN的结果,并且查询不会进行任何更改。

这比进行模式更改、使用临时表或中止事务要简单得多,因为您只需在现有查询前面插入"EXPLAIN“。

更多信息:https://dev.mysql.com/doc/refman/5.6/en/explain.html

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2433633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档