Comment tester une instruction SQL Update avant de l'exécuter?
Dans certains cas, l'exécution d'une instruction de mise à JOUR de la production peut sauver la journée. Cependant complètement foireuse mise à jour peut être pire que le problème initial.
Court de l'utilisation d'une base de données de test, quelles sont les options de dire ce qu'est une instruction de mise à jour va faire avant de l'exécuter?
Vous devez vous connecter pour publier un commentaire.
En outre à l'aide d'une transaction comme Imad a dit (ce qui devrait être obligatoire de toute façon), vous pouvez également faire un test de cohérence lignes qui sont affectées par l'exécution d'une sélection à l'aide du même clause where comme la mise à JOUR.
Donc, si vous mettez à JOUR est
De ce qui suit va vous montrer les lignes qui seront mis à jour:
FOREIGN KEY UPDATE CASCADE
votre sql échoueQue sur les Transactions? Ils ont la RESTAURATION de Fonctionnalité.
@voir https://dev.mysql.com/doc/refman/5.0/en/commit.html
Par exemple:
Réponse à la question de @rickozoe ci-dessous:
En général, ces lignes ne sera exécutée qu'une fois. En PHP.f.e. vous pouvez écrire quelque chose comme ça (peut-être un peu plus propre, mais je voulais réponse rapide 😉 ):
Un autre moyen serait d'utiliser MySQL Variables (voir https://dev.mysql.com/doc/refman/5.7/en/user-variables.html
et
https://stackoverflow.com/a/18499823/1416909
):
Mais je suggère d'utiliser la langue des wrappers disponible dans votre langage de programmation favori.
Autocommit OFF ...
MySQL
Il définit la autommit off pour la session en cours.
Vous exécutez votre déclaration, voir ce qu'il a changé, et puis la restauration si c'est mauvais ou s'engager si c'est ce que vous attendiez !
EDIT: L'avantage de l'utilisation de transactions au lieu de l'exécution de la requête select est que vous pouvez vérifier l'ensemble résultant easierly.
Je sais que c'est une répétition d'autres réponses, mais il a un peu de soutien émotionnel à faire le pas supplémentaire pour les tests de mise à jour 😀
Pour les tests de mise à jour, dièse # est votre ami.
Si vous avez une mise à jour de l'énoncé comme:
Vous hachage de mise à JOUR et de test, puis de hachage dans de retour:
Il travaille pour de simples déclarations.
Supplémentaires pratiquement obligatoire de la solution est, pour obtenir une copie (de sauvegarde en double), lors de l'utilisation de mise à jour sur une production de la table. Phpmyadmin > opérations > copie: table_yearmonthday. Il prend juste quelques secondes pour les tables <=100M.
Pas une réponse directe, mais j'ai vu beaucoup de complètement foireuse prod données situations qui auraient pu être évités par tapant la
WHERE
clause d'abord! Parfois, unWHERE 1 = 0
peut aider à mettre un travail déclaration d'ensemble en toute sécurité aussi. Et en regardant un plan d'exécution estimé, ce qui permettra d'estimer les lignes concernées, peut être utile. Au-delà, dans une transaction que vous roulez en arrière comme d'autres l'ont dit.WHERE FALSE
?WHERE 1 = 0
est plus portable, si quelqu'un vient à travers ce qui est de travailler avec un autre SGBD. Par exemple, SQL Server n'accepte pasWHERE FALSE
.Exécuter une requête select sur la même table avec tous les
where
conditions de l'application de requête de mise à jour.Dans ces cas que vous voulez tester, c'est une bonne idée de se concentrer uniquement sur actuel valeurs de la colonne et bientôt-à-être-mis à jour valeurs de la colonne.
Veuillez jeter un oeil à la suite de code que j'ai écrit pour mettre à jour WHMCS prix:
De cette façon, nous avons clairement comparer déjà valeurs existantes contre de nouvelles valeurs.
faire un
SELECT
d'elle,comme si vous avez
UPDATE users SET id=0 WHERE name='jan'
convertir
SELECT * FROM users WHERE name='jan'