2012-02-08 47 views

回答

35

使用transaction來包裝你的更新語句,並選擇查詢(測試更新),然後總是回滾。

例子:

BEGIN; 

UPDATE accounts SET balance = balance - 100.00 
    WHERE name = 'Alice'; 

SELECT accounts WHERE WHERE name = 'Alice'; 

ROLLBACK; -- << Important! Un-does your UPDATE statement above! 

事務通常與結尾的承諾,但因爲你只是測試,不想改變是永久性的,你只回滾。

28

將它包裝在transaction中,用SELECT和最後的回滾測試結果。

BEGIN; 

UPDATE ...; 

SELECT ...; 

ROLLBACK; 
+4

您可以在UPDATE查詢中使用RETURNING來跳過SELECT查詢。 – 2012-02-09 06:29:51

+0

如果您決定保留更改,請使用「COMMIT」而不是「ROLLBACK」。 – 2013-12-01 19:28:17

+0

@FrankHeikens你應該擴大到一個答案,非常有用! – mkataja 2015-07-02 15:01:19

0

運行SELECT語句第一相同的檢查:通過SELECT返回的行會按更新修改的行

+1

不足。可能有FK,CHECK約束,......簡單的SELECT不會命中。 SELECT只會測試WHERE子句,但即使SELECT成功,UPDATE也可能失敗。 – 2012-02-08 22:04:07

2

你總是可以在SQL Fiddle上建立一個示例數據庫並在那裏試用你的更新語句。

全面披露:我sqlfiddle.com

0

的考慮這個簡單的更新作者:

UPDATE Products 
    SET price_including_vat = price * 1.05 
WHERE product_type = 'Food'; 

我會用這樣的測試:

SELECT price_including_vat AS price_including_vat__before, 
     price * 1.05 AS price_including_vat__after, 
     * 
    FROM Products 
WHERE product_type = 'Food'; 

其實,我'd可靠地進行大腦,並做更像這樣的分析:

WITH updated AS 
    (
    SELECT price_including_vat AS price_including_vat__before, 
      price * 1.05 AS price_including_vat__after, 
      * 
     FROM Products 
    WHERE product_type = 'Food' 
    ) 
SELECT * 
    FROM updated 
WHERE price_including_vat__before = price_including_vat__after; 
3

您可以使用一個工具來讓您快速獲取數據庫並輕鬆回滾。 我建議OffScale - 它基本上是數據庫的git。

+0

主頁說這隻適用於MySQL - 或者至少沒有文檔說明如何使用不同的DBMS進行配置 – 2015-10-07 22:07:04