2010-03-12 18 views
17

¿Hay algo como esto:
TEST DELETE FROM user WHERE somekey = 45;¿Existe un comando para probar una consulta SQL sin ejecutarla? (MySQL o SQL ANSI)

que puede devolver cualquier error, por ejemplo, que no existe somekey, o alguna violación de restricción o nada, y reportando cómo serían las muchas filas afectado, pero no ejecutando la consulta?
Sé que puede convertir fácilmente cualquier consulta en una consulta de selección que no tenga ningún efecto de escritura o eliminación en ninguna fila, pero que puede generar errores y no es muy práctico si desea probar y depurar muchas consultas.

Respuesta

32

Lo único que conozco es envolverlo en una transacción que siempre se deshace:

BEGIN TRANSACTION 

DELETE FROM user WHERE somekey = 45; 

ROLLBACK TRANSACTION 

Asegúrese de que se ejecuta el bloque entero y no sólo la instrucción de eliminación. Además, NO ejecute esto en ningún entorno de producción ni en ningún sistema en el que no pueda permitirse perder los datos.

+2

¿Por qué no es una buena idea ejecutar esta consulta en un entorno de producción? – franzlorenzon

+0

@franzlorenzon Supongo que es solo una cosa paranoica de mi parte. No me gustaría olvidar la BEGIN TRANSACTION y borrar accidentalmente un registro. – NYSystemsAnalyst

+3

No funciona en MySQL – ub3rst4r

0

Que yo sepa, no existe tal cosa. Además, no sería un error si no existiera somekey con el valor 45. Simplemente no eliminaría nada.

+0

Quiero decir, solo como un ejemplo, que un campo escrito en una consulta puede no existir o estar mal escrito, y que genera un error de SQL. – Petruza

5

ANSI SQL: No.

MySQL: Maybe. La palabra clave EXPLAIN originalmente funcionaba solo con SELECT, pero podría haberse extendido a ACTUALIZAR y ELIMINAR por ahora.

+0

EXPLAIN funciona para mí con consultas de ACTUALIZACIÓN en MySQL 5.6.10 – Dwayne

8

En MySQL utilizar este

START TRANSACTION; 
QUERY; 

Es importante utilizar ";" porque si no lo haces, no funcionará. Por ejemplo

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

referencia aquí http://dev.mysql.com/doc/refman/5.0/en/commit.html

0

Puede utilizar F11 con Teradata Asistente SQL para hacer esto

0

más o menos. Supongamos que tiene una tabla que desea actualizar: "Entrada". Puede

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 

En este caso, Col1 y Col2 son las columnas de la tabla de entrada. Si escribió

UPDATE E 
SET 

en lugar de la SELECCIÓN inicial, tendría su actualización. No funciona para todos los escenarios pero, si se trata de una actualización simple, puede obtener una vista previa rápida de esta manera.

Cuestiones relacionadas