2010-03-12 71 views
17

有没有这样的事:
TEST DELETE FROM user WHERE somekey = 45;是否有命令测试SQL查询而不执行它? (MySQL或ANSI SQL)

,可以返回的任何错误,例如该somekey不存在,或者一些约束冲突或任何东西,和报告许多行会怎样受影响,但不执行查询?
我知道你可以很容易地在选择查询中打开任何查询,在任何行中都没有写或删除效果,但这可能会导致错误,并且如果要测试和调试许多查询,它不是很实用。

回答

32

我所知道的唯一的事情就是把它包起来的,就是始终回滚事务:

BEGIN TRANSACTION 

DELETE FROM user WHERE somekey = 45; 

ROLLBACK TRANSACTION 

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

+2

为什么在生产环境中运行此查询不是一个好主意? – franzlorenzon 2012-11-22 15:07:20

+0

@franzlorenzon我想这只是一个偏执狂的事情。我不想忘记BEGIN TRANSACTION并意外删除一条记录。 – NYSystemsAnalyst 2012-11-23 13:36:37

+3

不适用于MySQL – ub3rst4r 2013-01-10 07:12:26

0

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

+0

我的意思是,仅仅作为一个例子,查询中键入的字段可能不存在,或拼写错误,并且会产生SQL错误。 – Petruza 2010-03-12 16:55:33

5

ANSI SQL:否

MySQL:也许。 EXPLAIN关键字最初只与SELECT一起工作,但它现在可能已被扩展到UPDATE和DELETE。

+0

EXPLAIN在MySQL 5.6.10中使用UPDATE查询工作 – Dwayne 2013-10-09 17:06:16

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

0

您可以使用F11和Teradata SQL助理做到这一点

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,你会有你的更新。它不适用于所有情况,但如果它是简单更新,则可以通过此方式快速预览。