是否有一个命令来测试SQL查询而不执行它?(MySQL或ANSI SQL)

Pet*_*uza 22 mysql sql testing debugging

有这样的事情:
TEST DELETE FROM user WHERE somekey = 45;

这可以返回任何错误,例如somekey不存在,或某些约束违规或任何事情,并报告将受影响的行数,但不执行查询?
我知道您可以轻松地在任何行中没有写入或删除效果的选择查询中转换任何查询,但这可能导致错误,如果您要测试和调试许多查询,则不太实用.

DCN*_*YAM 38

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

BEGIN TRANSACTION

DELETE FROM user WHERE somekey = 45;

ROLLBACK TRANSACTION
Run Code Online (Sandbox Code Playgroud)

确保执行整个块而不仅仅是delete语句.此外,请勿在任何生产环境或任何您无法承受丢失数据的系统上运行此操作.

  • 我觉得必须做一个补充:请记住,你不能像"drop table"那样回滚DDL语句. (9认同)
  • 为什么在生产环境中运行此查询不是一个好主意? (3认同)
  • 这还要求目标表使用支持事务的引擎.(例如,这种方法**在MyISAM表上不起作用**.) (2认同)
  • MySQL当前是`START TRANSACTION;`(查询,带分号)`ROLLBACK;`。以艰难的方式学会了这一点。 (2认同)

絢瀬絵*_*瀬絵里 8

在MySQL中使用它

START TRANSACTION;
QUERY;
Run Code Online (Sandbox Code Playgroud)

使用";"很重要 因为如果你不这样做,那就不行了.例如

START TRANSACTION;
UPDATE tableX SET colX = valueA, colY = valueB WHERE id=1
Run Code Online (Sandbox Code Playgroud)

请参考http://dev.mysql.com/doc/refman/5.0/en/commit.html


DOO*_*iac 6

在MySQL 5.6中,EXPLAIN关键字可与SELECTDELETEINSERTREPLACE,和UPDATE语句。

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

这比进行模式更改,使用临时表或中止事务要简单得多,因为您要做的就是在现有查询之前插入“ EXPLAIN”。

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


Lar*_*tig 5

ANSI SQL:不.

MySQL:也许吧.EXPLAIN关键字最初只适用于SELECT,但它现在可能已扩展为UPDATE和DELETE.


Gil*_*les 2

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

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

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

例如,假设我有 2 个表 t1 和 t2,其中有数百万行,我将它们连接在一起。我想检查在 GUI(SQLYog 或 mysql 工作台等)中这可能需要多长时间,而不返回数百万行,这些行会耗尽内存,并且 GUI 可能需要时间来处理和显示。我使用黑洞引擎将行“转储”到任何地方。例如:

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
Run Code Online (Sandbox Code Playgroud)

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