2012-02-08 19 views

Respuesta

35

Utilice un transaction para envolver la instrucción de actualización y una consulta de selección (para probar la actualización) y luego siempre gírelo hacia atrás.

Ejemplo:

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! 

Una transacción normalmente termina con una confirmación, pero ya que usted está haciendo una prueba y no desea que los cambios sean permanentes sólo va a hacer retroceder.

28

Envuélvalo en un transaction, pruebe los resultados con un SELECCIONAR y retroceder al final.

BEGIN; 

UPDATE ...; 

SELECT ...; 

ROLLBACK; 
+4

Puede usar RETURNING en la consulta UPDATE para omitir la consulta SELECT. –

+0

Si decide mantener los cambios, use 'COMMIT' en lugar de' ROLLBACK'. –

+0

@FrankHeikens Deberías ampliar eso en una respuesta, ¡muy útil! – mkataja

0

Ejecutar el mismo cheque con una instrucción SELECT en primer lugar: las filas devueltas por SELECT serán las filas modificadas por la actualización del

+1

No es suficiente. Podría haber restricciones FK, CHECK, ... que un SELECT simple no golpearía. Un SELECT solo probaría la cláusula WHERE, pero la ACTUALIZACIÓN podría fallar aunque el SELECTO tenga éxito. –

2

Siempre puede crear una base de datos de muestra en SQL Fiddle y probar allí sus declaraciones de actualización.

La revelación completa: yo soy el autor de sqlfiddle.com

0

Dada esta simple actualización:

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

me pondría a prueba usando algo como esto:

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

En realidad, Probablemente involucraría el cerebro y haría un análisis más como este:

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

Puede usar una herramienta que le permita tomar una instantánea de la base de datos y deshacerla fácilmente. Recomiendo OffScale - es básicamente git para bases de datos.

+0

La página de inicio dice que esto solo funciona con MySQL, o al menos no hay documentación sobre cómo configurarlo con un DBMS diferente –

Cuestiones relacionadas