2010-03-12 75 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,你會有你的更新。它不適用於所有情況,但如果它是簡單更新,則可以通過此方式快速預覽。