10 Stimmen

Behauptung in MySQL

Ich habe ein SQL-Skript, das gegen eine große Datenbank ausgeführt werden soll. Ich möchte am Anfang ein paar einfache Abfragen stellen, nur um sicherzugehen.

Gibt es eine Möglichkeit, in MySQL eine Assertion zu schreiben? Oder irgendeine Art von "SELECT ..., und wenn es nicht mit diesem Wert übereinstimmt, dann den gesamten Befehl abbrechen"?

0 Stimmen

Mehr Details - was genau suchen Sie für Entscheidungslogik zu verwenden - eine Tabelle, eine Spalte, einen spezifischen Wert?

1 Stimmen

Ich bin in diesem Punkt etwas flexibel, da ich nur sicherstellen möchte, dass es sich um die richtige Datenbank handelt und die Daten nicht schrecklich falsch sind. Ein Blick auf eine count(*) oder min(Feld) (in einem bestimmten Bereich) oder sicherstellen, dass Feld<>'const' oder ähnliches wäre großartig.

8voto

sectus Punkte 15258

Ein bisschen verrückter Code. Der Hauptpunkt ist: SET könnte einen Fehler für MySQL-Variablen auslösen.

Zum Beispiel.

 SET @wert = 0;
 SET SESSION sql_mode = if(@wert, @@SESSION.sql_mode, 'etwas stimmt hier nicht'); 

Würde ERROR 1231 (42000): Variable 'sql_mode' can't be set to the value of 'something wrong uphere' ausgeben und die Ausführung würde gestoppt werden.

Dieser Ansatz ist zwar nicht semantisch, aber er funktioniert.

3voto

Brett Punkte 4001

Sie könnten das gesamte Skript in einer if-Anweisung setzen, abhängig davon, welche Art von Wert Sie überprüfen müssen, hier ist ein Beispiel:

DECLARE @value int
SET @value = (SELECT COUNT(*) FROM dbo)

IF @value >0
BEGIN
 --Hier Sachen machen
END

3 Stimmen

MySQL erlaubt leider keinen Steuerfluss außerhalb von gespeicherten Programmen. Das ist frustrierend.

0 Stimmen

@Brett, Dies funktioniert nicht für MySQL. Siehe die Antworten unten.

1voto

schizix Punkte 25

Sie können dies auch über eine gespeicherte Prozedur / Funktion tun, wie im folgenden Beispiel:

CREATE FUNCTION `RunProcess`() RETURNS INT(11)
runProcess:BEGIN

DECLARE check_value INT;
DECLARE error_code INT;

SELECT COUNT(*) FROM dbo INTO check_value;

IF check_value = 0 THEN set error_code = 666;
    LEAVE runProcess;
    RETURN error_code;
END IF;

...
...
END;

0 Stimmen

Dies könnte ein Problem darstellen, wenn Sie auch andere SPROCs ausführen wollen...........

0voto

Will59 Punkte 1067

Ein Weg, dies zu tun, könnte sein, eine Einfügung absichtlich scheitern zu lassen, wenn Ihre Behauptung scheitert. Dies ist nicht schön, aber es ist einfach und es funktioniert.

Angenommen, Tabelle1 enthält SpalteA und SpalteB. Sie möchten in diese Tabelle die Werte ('irgendein', 'Ding') einfügen, aber NUR, wenn diese Werte bestimmte Bedingungen erfüllen.

Dann tun Sie etwas wie das Folgende:

SELECT 'irgendein', 'Ding' INTO @setA, @setB FROM DUAL WHERE ( Ihre Bedingungen...);
INSERT INTO Tabelle1 (SpalteA, SpalteB) VALUES (@setA, @setB);

Die 'irgendein' und 'Ding' Werte würden offensichtlich zur Laufzeit in der Abfrage eingefügt werden. Wenn Ihre Tabelle1 so eingerichtet ist, dass sie nur Nicht-NULL-Werte in Spalte A oder B akzeptiert, schlägt dies fehl, wenn Ihre Bedingungen fehlschlagen.

Ein sehr einfaches unsinniges Beispiel (dies kann natürlich anders erreicht werden, dies ist nur ein Beispiel :-) ), wenn Sie möchten, dass sich die Werte unterscheiden:

SELECT 'irgendein', 'Ding' INTO @setA, @setB FROM DUAL WHERE ( 'a' != 'b');
INSERT INTO Tabelle1 (SpalteA, SpalteB) VALUES (@setA, @setB);

Die Testbedingung muss nicht auf die Werte gerichtet sein, die Sie einzufügen versuchen:

SELECT 'irgendein', 'Ding' INTO @setA, @setB FROM DUAL WHERE ( 'einander' IS NOT NULL);
INSERT INTO Tabelle1 (SpalteA, SpalteB) VALUES (@setA, @setB);

Wenn Ihr Ziel nicht darin besteht, einen Einfügevorgang durchzuführen, kann dieselbe Logik auf verschiedene Transaktionstypen angewendet werden, wobei die Idee darin besteht, die Variablen zu verändern, damit die Abfrage fehlschlägt.

Oder Sie können eine Dummy-Tabelle nur zu diesem Zweck erstellen, mit einer Nicht-NULL-Spalte, und immer das Ergebnis Ihrer Behauptung in die erste Zeile der Dummy-Tabelle einfügen. Nicht schön, aber es funktioniert :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X