2017-03-16 7 views
1

Ich habe viele SO-Threads überprüft (one of them here) aber konnte nicht finden, wo das Problem liegt.mysql create trigger syntax error

Ich versuche zu schützen, dass eine Spalte aktualisiert wird, wenn sie nicht null ist, nach this thread.

Aber ich bekomme Syntaxfehler von MySQL. Hier ist mein Code:

DELIMITER $$ 

CREATE TRIGGER lock_x_id 
BEFORE UPDATE ON Games 
FOR EACH ROW BEGIN 
    IF (old.xid IS NOT NULL) THEN 
    SIGNAL 'error'; 
    END IF; 
END$$ 

DELIMITER ; 
+0

, was der Fehler ist? –

+0

Fehler 1064 (42000): Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version entspricht, damit die richtige Syntax in der Nähe von '' error '' verwendet werden kann; –

Antwort

2

Wenn Sie versuchen, Fehler zu erhöhen, über SIGNAL müssen Sie die SQLSTATE spezifizieren, die der Fehlercode und für den Benutzer allgemeinen Fehlercodes definierten seine 45000 zusammen mit dem Nachrichtentext MESSAGE_TEXT

so ist der Auslöser wird als

delimiter // 
create trigger lock_x_id before update on games 
for each row 
begin 
if old.xid is not null then 
    signal SQLSTATE VALUE '45000' SET MESSAGE_TEXT = 'Your custom error message'; 
end if; 
end;// 
delimiter ; 

Test Case

mysql> select * from games; 
+----+------+------+ 
| id | xid | val | 
+----+------+------+ 
| 1 | NULL | 1 | 
| 2 | NULL | 2 | 
| 3 | NULL | 3 | 
| 4 | 1 | 4 | 
| 5 | 2 | 5 | 
+----+------+------+ 

Ermöglicht den Trigger erstellen jetzt

mysql> delimiter // 
mysql> create trigger lock_x_id before update on games 
    -> for each row 
    -> begin 
    -> if old.xid is not null then 
    -> signal SQLSTATE VALUE '45000' SET MESSAGE_TEXT = 'Your custom error message'; 
    -> end if; 
    -> end;// 
Query OK, 0 rows affected (0.05 sec) 


mysql> update games set xid = 4 where id = 1; 
Query OK, 1 row affected (0.06 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

mysql> update games set xid = 5 where id=5; 
ERROR 1644 (45000): Your custom error message 

und nach dem obigen 2 Update-Befehle ausführen hier, wie die Tabelle

mysql> select * from games; 
+----+------+------+ 
| id | xid | val | 
+----+------+------+ 
| 1 | 4 | 1 | 
| 2 | NULL | 2 | 
| 3 | NULL | 3 | 
| 4 | 1 | 4 | 
| 5 | 2 | 5 | 
+----+------+------+ 

Hinweis sieht, dass das zweite Update ist fehlgeschlagen und die Zeile unverändert.

Lesen Sie mehr über dieses https://dev.mysql.com/doc/refman/5.5/en/signal.html

+0

funktioniert perfekt! Jetzt ist das einzige, was mich nervt, Sequelize, lass mich nicht 'Delimiter' setzen. aber vielen Dank! –

+1

Wenn Sie 'sequelize' auf node.js verwenden, müssen Sie nur den Trigger-Code angeben, und es muss kein' delimiter' angegeben werden, da die Bibliothek das erledigt. Das Trennzeichen wird benötigt, wenn Sie auf der CLI ausgeführt werden. 'sequelize.query (/ * trigger code * /)' Oder du kannst Hooks verwenden, um das Ereignis vor dem Update zu behandeln http://docs.sequelizejs.com/en/latest/docs/hooks/ –

+1

oh man, was soll ich sagen ?! Das ist es! Ich kann dir nicht genug danken! –