Y a-t-il quelque chose comme ça:TEST DELETE FROM user WHERE somekey = 45;
Cela peut renvoyer des erreurs, par exemple qu’une clé n’existe pas, ou qu’une violation de contrainte ou quoi que ce soit, et indiquer combien de lignes seraient affectées sans exécuter la requête?
Je sais que vous pouvez facilement transformer n'importe quelle requête en requête select qui n'a pas d'effet d'écriture ou de suppression dans une ligne, mais cela peut entraîner des erreurs et ce n'est pas très pratique si vous souhaitez tester et déboguer de nombreuses requêtes.
Je me rends compte que c’est un peu une vieille question mais pour être complet ...
Si le but est de trouver le temps de traitement de la requête sans renvoyer de lignes (j'en ai souvent besoin, je veux savoir combien de temps un morceau de code que j'utilise prendra sans qu'il ne renvoie deux millions de lignes qui ne m'intéressent pas voir) alors le moteur BLACKHOLE peut être très utile:
https://dev.mysql.com/doc/refman/8.0/fr/blackhole-storage-engine.html
Par exemple, disons que j'ai 2 tables, t1 & t2, avec des millions de lignes, que je suis en train de joindre. Je souhaite vérifier le temps que cela prendra dans une interface utilisateur graphique (SQLYog ou mysql workbench ou similaire) sans renvoyer des millions de lignes qui vont perdre de la mémoire et qui prendront probablement du temps à traiter et à afficher. J'utilise le moteur de trou noir pour "vider" les lignes vers nulle part. EG:
CREATE TABLE tBH (a TINYINT) ENGINE = BLACKHOLE;
SELECT NOW(); -- Show start time
INSERT tBH
SELECT 1 FROM t1
LEFT JOIN t2 ON t1.key1 = t2.key1;
SELECT NOW(); -- Show end time
Notez que comme je cherche juste le temps d'exécution, je ne me donne pas la peine de renvoyer toutes les colonnes (IE avec "*") mais juste un espace réservé ("1" dans ce cas).
La seule chose que je sache, c’est de l’envelopper dans une transaction toujours annulée:
BEGIN TRANSACTION
DELETE FROM user WHERE somekey = 45;
ROLLBACK TRANSACTION
Assurez-vous d'exécuter le bloc entier et pas seulement l'instruction delete. En outre, NE l'exécutez PAS sur un environnement de production ou un système où vous ne pouvez pas vous permettre de perdre les données.
Dans MySQL, utilisez cette
START TRANSACTION;
QUERY;
Il est important d'utiliser ";" parce que si vous ne le faites pas, ça ne marchera pas. Par exemple
START TRANSACTION;
UPDATE tableX SET colX = valueA, colY = valueB WHERE id=1
Référence ici http://dev.mysql.com/doc/refman/5.0/en/commit.html
ANSI SQL: Non.
MySQL: Peut-être. Le mot-clé EXPLAIN ne fonctionnait à l'origine qu'avec SELECT, mais il a peut-être déjà été étendu à UPDATE et DELETE.
Depuis MySQL 5.6, le mot clé EXPLAIN
fonctionne avec les instructions SELECT
, DELETE
, INSERT
, REPLACE
et UPDATE
.
Si votre requête comporte une erreur de syntaxe, elle échouera tout de même. Toutefois, si l'opération aboutit, vous ne verrez que les résultats d'un EXPLAIN et la requête n'apportera aucune modification.
C'est beaucoup plus simple que de faire des modifications de schéma, d'utiliser des tables temporaires ou d'abandonner des transactions, il suffit d'insérer "EXPLAIN" devant votre requête existante.
Plus d'informations: https://dev.mysql.com/doc/refman/5.6/en/explain.html
À ma connaissance, une telle chose n'existe pas. De plus, ce ne serait pas une erreur si aucune somekey
avec la valeur 45 n’existait. Cela ne supprimerait simplement rien.
Genre de. Supposons que vous souhaitiez mettre à jour une table: "Entrée". Vous pouvez
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
Dans cet exemple, Col1 et Col2 sont des colonnes de la table Entry. Si vous avez écrit
UPDATE E
SET
au lieu du SELECT initial, vous auriez votre mise à jour. Cela ne fonctionne pas pour tous les scénarios, mais s'il s'agit d'une simple mise à jour, vous pouvez obtenir un aperçu rapide de cette façon.
Możesz użyćF11Assistant SQL de Teradata