update inner example delete mysql sql database testing myisam

mysql - inner - update sql oracle



¿Cómo probar una declaración SQL Update antes de ejecutarla? (7)

¿Qué hay de las transacciones? Tienen el ROLLBACK-Feature.

@see https://dev.mysql.com/doc/refman/5.0/en/commit.html

Por ejemplo:

START TRANSACTION; SELECT * FROM nicetable WHERE somthing=1; UPDATE nicetable SET nicefield=''VALUE'' WHERE somthing=1; SELECT * FROM nicetable WHERE somthing=1; #check COMMIT; # or if you want to reset changes ROLLBACK; SELECT * FROM nicetable WHERE somthing=1; #should be the old value

Responda la pregunta de @rickozoe a continuación:

En general, estas líneas no se ejecutarán como una vez. En PHP fe escribirías algo así (quizás un poco más limpio, pero quería responder rápido ;-)):

$MysqlConnection->query(''START TRANSACTION;''); $erg = $MysqlConnection->query(''UPDATE MyGuests SET lastname=''Doe'' WHERE id=2;''); if($erg) $MysqlConnection->query(''COMMIT;''); else $MysqlConnection->query(''ROLLBACK;'');

Otra forma sería utilizar las variables de MySQL (ver https://dev.mysql.com/doc/refman/5.7/en/user-variables.htm l y https://stackoverflow.com/a/18499823/1416909 ):

# do some stuff that should be conditionally rollbacked later on SET @v1 := UPDATE MyGuests SET lastname=''Doe'' WHERE id=2; IF(v1 < 1) THEN ROLLBACK; ELSE COMMIT; END IF;

Pero sugeriría utilizar los envoltorios de idiomas disponibles en su lenguaje de programación favorito.

En algunos casos, ejecutar una instrucción UPDATE en producción puede salvar el día. Sin embargo, una actualización borked puede ser peor que el problema inicial.

En lugar de usar una base de datos de prueba, ¿qué opciones hay para decir qué hará una declaración de actualización antes de ejecutarla?


Además de usar una transacción como ha dicho Imad (que de todos modos debería ser obligatoria), también puede hacer una comprobación de la cordura de las filas que se ven afectadas ejecutando una selección usando la misma cláusula WHERE que la ACTUALIZACIÓN.

Entonces, si ACTUALIZAS es

UPDATE foo SET bar = 42 WHERE col1 = 1 AND col2 = ''foobar'';

Lo siguiente le mostrará qué filas se actualizarán:

SELECT * FROM foo WHERE col1 = 1 AND col2 = ''foobar'';


Autocommit OFF ...

MySQL

set autocommit=0;

Establece el apagado automático para la sesión actual.

¡Ejecuta su extracto, ve lo que ha cambiado y, luego, invierta si es incorrecto o comprométase si es lo que esperaba!

EDITAR: El beneficio de usar transacciones en lugar de ejecutar una consulta de selección es que puede verificar el conjunto resultante más fácilmente.


Ejecute la consulta de selección en la misma tabla con todas las condiciones que está aplicando en la consulta de actualización.


No es una respuesta directa, pero he visto muchas situaciones de datos de pinchazos borked que podrían haberse evitado escribiendo primero la cláusula WHERE . A veces, WHERE 1 = 0 puede ayudar a establecer una declaración de trabajo juntos de manera segura también. Y mirar un plan de ejecución estimado, que estimará las filas afectadas, puede ser útil. Más allá de eso, en una transacción que revierte como han dicho otros.


Sé que esto es una repetición de otras respuestas, pero tiene cierto apoyo emocional para dar el paso adicional para probar la actualización: D

Para la actualización de prueba, hash # es tu amigo.

Si tiene una declaración de actualización como:

UPDATE wp_history SET history_by="admin" WHERE history_ip LIKE ''123%''

HasH ACTUALIZAR y ESTABLECER para probar, luego hash ellos de nuevo en:

SELECT * FROM #UPDATE wp_history #SET history_by="admin" WHERE history_ip LIKE ''123%''

Funciona para declaraciones simples.

Una solución adicional prácticamente obligatoria es, para obtener una copia (copia de seguridad duplicada), siempre que utilice la actualización en una tabla de producción. Phpmyadmin> operations> copy: table_yearmonthday. Solo lleva unos segundos para tablas <= 100M.


hacer una SELECT de eso,

como si tu tienes

UPDATE users SET id=0 WHERE name=''jan''

convertirlo a

SELECT * FROM users WHERE name=''jan''