2010-03-12 4 views
17

Gibt es etwas wie folgt aus:
TEST DELETE FROM user WHERE somekey = 45;Gibt es einen Befehl, um eine SQL-Abfrage zu testen, ohne sie auszuführen? (MySQL oder ANSI SQL)

dass Fehler zurückgeben kann, zum Beispiel, dass somekey nicht existiert, oder eine Beschränkung verletzt oder irgendetwas, und berichten, wie viele Zeilen wäre betroffen, aber nicht die Abfrage ausführen?
Ich weiß, dass Sie jede Abfrage in einer Select-Abfrage, die keinen Schreib- oder Lösch-Effekt in einer Zeile hat, leicht umwandeln können, aber das kann zu Fehlern führen, und es ist nicht sehr praktisch, wenn Sie viele Abfragen testen und debuggen möchten.

Antwort

32

Das einzige, was ich kenne, ist es in einer Transaktion zu wickeln, die immer wieder aufgerollt wird:

BEGIN TRANSACTION 

DELETE FROM user WHERE somekey = 45; 

ROLLBACK TRANSACTION 

Achten Sie darauf, den gesamten Block ausführen und nicht nur die Lösch Aussage. Führen Sie das Programm NICHT in einer Produktionsumgebung oder einem System aus, in dem Sie es sich nicht leisten können, die Daten zu verlieren.

+2

Warum ist es nicht eine gute Idee, diese Abfrage in einer Produktionsumgebung auszuführen? – franzlorenzon

+0

@franzzlorenzon Ich denke, es ist nur eine paranoide Sache von meiner Seite. Ich möchte die BEGIN TRANSACTION nicht vergessen und versehentlich einen Datensatz löschen. – NYSystemsAnalyst

+3

Funktioniert nicht mit MySQL – ub3rst4r

0

Meiner Kenntnis nach existiert so etwas nicht. Außerdem wäre es kein Fehler, wenn somekey mit dem Wert 45 nicht existiert. Es würde nichts löschen.

+0

Ich meinte, nur als ein Beispiel, dass ein Feld, das in einer Abfrage eingegeben wird, möglicherweise nicht vorhanden oder falsch geschrieben ist, und das einen SQL-Fehler generiert. – Petruza

5

ANSI SQL: Nr.

MySQL: Vielleicht. Das EXPLAIN-Schlüsselwort funktionierte ursprünglich nur mit SELECT, wurde aber möglicherweise bereits auf UPDATE und DELETE erweitert.

+0

EXPLAIN funktioniert für mich mit UPDATE-Abfragen in MySQL 5.6.10 – Dwayne

8

In MySQL verwenden diese

START TRANSACTION; 
QUERY; 

Es ist wichtig, zu verwenden ";" denn wenn du es nicht tust, wird es nicht funktionieren. Zum Beispiel

START TRANSACTION; 
UPDATE tableX SET colX = valueA, colY = valueB WHERE id=1 

Referenz hier http://dev.mysql.com/doc/refman/5.0/en/commit.html

0

können Sie F11 mit Teradata SQL-Assistenten verwenden diese

0

Art zu tun. Angenommen, Sie haben eine Tabelle, die Sie aktualisieren möchten: "Eintrag". Sie können

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 

In diesem Fall sind Col1 und Col2 Spalten der Entry-Tabelle. Wenn Sie statt der ursprünglichen SELECT-Anweisung

UPDATE E 
SET 
schreiben, haben Sie Ihr Update. Es funktioniert nicht für alle Szenarien, aber wenn es sich um ein einfaches Update handelt, können Sie auf diese Weise eine schnelle Vorschau erhalten.

Verwandte Themen