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

时间:2010-03-12 15:13:30

标签: sql mysql debugging testing

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

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

9 个答案:

答案 0 :(得分:38)

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

BEGIN TRANSACTION

DELETE FROM user WHERE somekey = 45;

ROLLBACK TRANSACTION

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

答案 1 :(得分:8)

在MySQL中使用此

START TRANSACTION;
QUERY;

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

START TRANSACTION;
UPDATE tableX SET colX = valueA, colY = valueB WHERE id=1

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

答案 2 :(得分:5)

ANSI SQL:否。

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

答案 3 :(得分:2)

从MySQL 5.6开始,EXPLAIN关键字可与SELECTDELETEINSERTREPLACEUPDATE语句一起使用。 / p>

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

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

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

答案 4 :(得分:1)

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

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

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

例如说我有2张桌子,t1& t2,有数百万行,我正在加入。我想在GUI(SQLYog或mysql工作台或某些工作台)中检查这可能需要多长时间,而不会返回数百万行会耗尽内存并且可能需要时间来处理和显示GUI。我用黑洞引擎来“转储”#行无处可去。 EG:

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"在这种情况下) )。

答案 5 :(得分:0)

据我所知,不存在这样的事情。此外,如果不存在值为45的somekey,则不会出错。它不会删除任何东西。

答案 6 :(得分:0)

您可以使用Teradata SQL Assistant F11 来执行此操作

答案 7 :(得分:0)

有点儿。假设您有一个要更新的表:" Entry"。你可以

SELECT Col1 = OTHER.Col4,
       Col2 = EXTRA.Col2,
FROM dbo.Entry E
    INNER JOIN MYOTHERTABLE OTHER ON OTHER.Id = E.Id
    INNER JOIN MYEXTRATABLE EXTRA ON EXTRA.Id = OTHER.Id

在这种情况下,Col1和Col2是Entry表的列。如果你写了

UPDATE E
SET

而不是初始SELECT,您有更新。它并不适用于所有场景,但如果它是一个简单的更新,您可以通过这种方式快速预览。

答案 8 :(得分:0)

这是一个古老的问题,但是在今天寻找相同的东西之后,我还是用

解决了这个问题

$prepResult = $connection->prepare($query);

似乎可以在大多数情况下使用-表示它可以可靠地检查语法,但针对数据库进行测试。 因此,举例来说,使用INSERT INTO时,将字符串插入INT列,删除未知表也不会失败,就像截断未知表一样……

所以,这将带您到那里-中途;)