web-dev-qa-db-fra.com

Existe-t-il une commande permettant de tester une requête SQL sans l'exécuter? (MySQL ou ANSI SQL)

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. 

21
Petruza

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).

1
Giles

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.

35
DCNYAM

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

8
絢瀬絵里

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.

5
Larry Lustig

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

2
DOOManiac

À 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.

0

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.

0
Jon S

Możesz użyćF11Assistant SQL de Teradata

0
Brandon See