Dans certains cas, l'exécution d'une instruction UPDATE en production peut sauver la situation. Cependant, une mise à jour bloquée peut être pire que le problème initial.
À moins d'utiliser une base de données de test, quelles sont les options pour dire ce qu'une instruction de mise à jour fera avant de l'exécuter?
FOREIGN KEY UPDATE CASCADE
votre sql échoueQu'en est-il des transactions? Ils ont la fonction ROLLBACK.
@voir https://dev.mysql.com/doc/refman/5.0/en/commit.html
Par exemple:
Répondez à la question de @rickozoe ci-dessous:
En général, ces lignes ne seront pas exécutées une seule fois. En PHP, vous écririez quelque chose comme ça (peut-être un peu plus propre, mais je voulais répondre rapidement ;-)):
Une autre façon serait d'utiliser les variables MySQL (voir https://dev.mysql.com/doc/refman/5.7/en/user-variables.htm l et https://stackoverflow.com/a/18499823/1416909 ):
Mais je suggérerais d'utiliser les wrappers de langage disponibles dans votre langage de programmation préféré.
la source
Autocommit OFF ...
MySQL
Il désactive la validation automatique pour la session en cours.
Vous exécutez votre instruction, voyez ce qu'elle a changé, puis annulez si elle est incorrecte ou validez si c'est ce que vous attendiez!
EDIT: L'avantage d'utiliser des transactions au lieu d'exécuter une requête de sélection est que vous pouvez vérifier plus facilement l'ensemble résultant.
la source
Je sais que c'est une répétition d'autres réponses, mais cela a un certain soutien émotionnel pour faire le pas supplémentaire pour tester la mise à jour: D
Pour tester la mise à jour, hash # est votre ami.
Si vous avez une déclaration de mise à jour comme:
Vous hachez UPDATE et SET pour les tester, puis les hachez à nouveau:
Cela fonctionne pour les déclarations simples.
Une autre solution pratiquement obligatoire consiste à obtenir une copie (copie de sauvegarde) chaque fois que vous utilisez la mise à jour sur une table de production. Phpmyadmin> opérations> copie: table_yearmonthday. Cela ne prend que quelques secondes pour les tables <= 100M.
la source
Ce n'est pas une réponse directe, mais j'ai vu de nombreuses situations de données de prod embarrassées qui auraient pu être évitées en tapant d'abord la
WHERE
clause ! Parfois, unWHERE 1 = 0
peut aider à rédiger une déclaration de travail en toute sécurité. Et regarder un plan d'exécution estimé, qui évaluera les lignes affectées, peut être utile. Au-delà de cela, dans une transaction que vous annulez comme d'autres l'ont dit.la source
WHERE 1 = 0
n'est plus portable si quelqu'un rencontre cela qui travaille avec un SGBD différent. Par exemple, SQL Server n'acceptera pasWHERE FALSE
.Dans les cas que vous souhaitez tester, il est judicieux de se concentrer uniquement sur les valeurs de colonne actuelles et sur les valeurs de colonne bientôt mises à jour .
Veuillez jeter un œil au code suivant que j'ai écrit pour mettre à jour les prix WHMCS:
De cette façon, nous comparons clairement les valeurs déjà existantes par rapport aux nouvelles valeurs.
la source
Exécutez la requête de sélection sur la même table avec toutes les
where
conditions que vous appliquez dans la requête de mise à jour.la source
en faire un
SELECT
,comme si tu avais
UPDATE users SET id=0 WHERE name='jan'
le convertir en
SELECT * FROM users WHERE name='jan'
la source