2016-03-19 13 views
0

Ich bin gerade zu phymysql umgezogen und habe Probleme beim Erstellen eines Triggers. Unten ist mein Skriptmysql Triggerfehler einfügen

CREATE TRIGGER trgAutoInsert AFTER INSERT ON profile 
FOR EACH ROW 
BEGIN 

    DECLARE var1 INT; 
    DECLARE var2 INT; 
    DECLARE var3 CHAR(100); 
    DECLARE var4 CHAR(100); 
    DECLARE var5 CHAR(3); 

    SELECT  profile_id, 
       profile_id, 
       fname, 
       fname, 
       fpage 
     FROM profile 
     INTO var1, 
       var2, 
       var3, 
       var4, 
       var5; 

    IF var5 = 'yes' 
    THEN 

     INSERT INTO fiends 
       (req_id, resp_id, req_name, resp_name, fpage) 
      VALUES 
       (var1, var2, var3, var4, 'yes'); 

    END IF; 

END 

Wenn ich mir diesen Fehler ausführen

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5 

Jede Hilfe meint geschätzt wird.

+0

spencer7593 einen guten Punkt angehoben, die mich dazu gebracht, meine erste Antwort zu löschen. Meine Fragen für Sie sind: Was ist der Zweck dieses Auslösers? und welchen Datenbank-Client benutzen Sie? –

+0

Ich denke, es gibt mehrere Probleme. Ich habe die meisten von ihnen in meiner Antwort angesprochen. Es ist nicht angegeben, welchen Client Sie verwenden, wie Sie den Trigger erstellen. Einige GUI-Clients verfügen möglicherweise über einen "create trigger" -Editor, der die Trennzeichen automatisch für Sie verarbeitet. Ich schlage vor, Sie entwickeln den Auslöser in Phasen. Als erste Stufe empfehle ich Ihnen, mit einem Auslöser mit einem fast leeren, fast nichts, Körper zu beginnen. Und dann baue von dort aus. – spencer7593

+0

Als nächste Stufe müssen Sie bestimmen, was Ihr Trigger tun soll. Eine oder zwei Kommentarzeilen, die den Zweck des Auslösers angeben, würden nicht schaden. Zu wissen, was der Trigger tun soll, ist ein langer Weg, um ihn zu schreiben. Anhand der Antworten können Sie sehen, dass Gordon und ich sehr unterschiedliche Vorstellungen davon hatten, was der Auslöser bewirken würde. – spencer7593

Antwort

0

Der typische Weg, dies in MySQL zu tun verwendet :=:

SELECT var1 := profile_id, 
     var2 := profile_id, 
     var3 := fname, 
     var4 := fname, 
     var5 := fpage 
FROM profile; 

Meiner Meinung nach ist die into Klausel gibt es zu Oracle ähnlich.

Das heißt, zwei Dinge zu beachten:

  1. Dies anzunehmen scheint, dass profile nur eine Zeile hat. Normalerweise würde es eine where Klausel geben.
  2. Sie sollten Ihre Variablen mit einem Präfix (zB v_) benennen, damit sie nicht mit Spalten verwechselt werden.

Allerdings würde ich dies schreibe, ohne dass die Variablen:

DELIMITER $$ 
CREATE TRIGGER trgAutoInsert AFTER INSERT ON profile 
FOR EACH ROW 
BEGIN 
    INSERT INTO fiends(req_id, resp_id, req_name, resp_name, fpage) 
     SELECT profile_id, profile_id, fname, fname 
     FROM profile p 
     WHERE fpage = 'yes'; 
END$$ 
DELIMITER ; 

So viel einfacher zu sein scheint. Ich vermute, dass yes sollte eine Zeichenfolge sein.

EDIT:

Wenn Sie die Zeilen nur eingefügt werden soll, verwenden Sie new:

DELIMITER $$ 
CREATE TRIGGER trgAutoInsert AFTER INSERT ON profile 
FOR EACH ROW 
BEGIN 
    INSERT INTO fiends(req_id, resp_id, req_name, resp_name, fpage) 
     SELECT new.profile_id, new.profile_id, new.fname, new.fname 
     FROM dual 
     WHERE new.fpage = 'yes'; 
END$$ 
DELIMITER ; 
+0

Scheint, dass dies das Potenzial hat, viele Duplikate Zeilen in 'Teufels' zu erstellen. Nichts ist damit ungültig, aber ich vermute, dass in OP-Trigger, das 'SELECT ... FROM-Profil' war OP versuchen, die Werte aus der Zeile, die gerade eingefügt wurden. Ich vermute, was OP wirklich wollte, war ..: NEW.profile_id,: NEW.fname,: NEW.fpage. Aber das ist nur eine Vermutung ... die Frage spezifiziert nicht das erwartete Ergebnis, wenn der Auslöser ausgelöst wird. – spencer7593

+0

@spencer7593. . . Das ist ein wirklich guter Punkt. –

+0

Acckk ... mein Orakel zeigt. Ich habe Doppelpunkte vor NEW verwendet. Natürlich verwendet MySQL nicht nur 'NEW' und nicht den Oracle-Stil' NEW'. (Ich bin immer noch neugierig, warum wir in eine Tabelle mit dem Namen 'Teufel 'einfügen. Ich vermute unser Profil ist mit unseren' Freunden' verbunden. Und nicht alle meine Freunde sind Freunde. – spencer7593

0

Ich vermute, dass das Problem mit der Aussage Trennzeichen ist; Ich vermute, dass es immer noch auf das Semikolon gesetzt ist.

Da der Auslöser Semikolon Zeichen enthält, erhalten die „create trigger“ Anweisung als eine Einheit ausgeführt werden, müssen Sie das Trennzeichen in eine Zeichenfolge ändern, die nicht überall auftreten innerhalb der „create trigger“ Anweisung

zum Beispiel:

-- change the statement delimiter to something other than semicolon 
DELIMITER $$ 

-- execute the "create trigger" statement containing semicolons 
CREATE TRIGGER ... 
BEGIN 
    ... ; 
    ... ; 
    IF (...) THEN 
     ... ; 
    END IF; 
    ... ; 
END$$ 
-- the occurrence of the $$ delimiter on the line above ends the statement 

-- change the delimiter back to semicolon 
DELIMITER ; 

auch denke ich ein Trigger nicht erlaubt ist, aus derselben Tabelle auszuwählen, die in gerade eingefügt wurde. (Ich weiß, das ist eine Einschränkung von FOR EACH ROW Triggern in Oracle; ich müsste das MySQL Reference Manual konsultieren, um sicher zu gehen ... es gibt einen Abschnitt über "Einschränkungen für mysql gespeicherte Programme", Prozeduren sind die liberalsten, Funktionen haben dieselben Einschränkungen wie Prozeduren, plus mehr, und Trigger haben die gleichen Einschränkungen wie Funktionen und mehr

Auch wenn dieser Trigger ausgeführt wird (wenn es erlaubt ist, aus derselben Tabelle auszuwählen), ist die SELECT-Anweisung wahrscheinlich zurückgeben mehr als eine Zeile Mit INTO Formular erwarten wir höchstens eine Zeile zurückgegeben

Wenn die Absicht ist, die Werte der Zeile, die gerade eingefügt wurde, verweisen, und verwenden Sie diese in einer Einfügung in eine andere Zeile Tabelle fiends (oder friends? ) verwenden Sie das Formular NEW.column_name die Werte

Zum Beispiel zu verweisen:

DELIMITER $$ 

CREATE TRIGGER profile_ai 
AFTER INSERT ON profile 
FOR EACH ROW 
BEGIN 
    IF (NEW.fpage = 'yes') THEN 
     -- are some of your friends fiends ? 
     INSERT INTO fiends 
     (req_id 
     , resp_id 
     , req_name 
     , resp_name 
     , fpage 
     ) VALUES 
     (NEW.profile_id 
     , NEW.profile_id 
     , NEW.fname 
     , NEW.fname 
     , 'yes' 
     ); 
    END IF; 
END$$ 

DELIMITER ;