2016-12-10 4 views
0

Ich habe zwei Tabellen und möchte einen Trigger erstellen ticket_reply zu löschen, wenn ein Ticket gelöscht:Trigger auf VOR Fehler

Ticket:

+-------------+-----------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+-----------------+------+-----+---------+----------------+ 
| id   | int(8) unsigned | NO | PRI | NULL | auto_increment | 
| user_id  | int(8) unsigned | NO | MUL | NULL |    | 
| status  | varchar(6)  | NO |  | opened |    | 
| subject  | varchar(100) | NO | MUL | NULL |    | 
| message  | text   | NO |  | NULL |    | 
+-------------+-----------------+------+-----+---------+----------------+ 

Und ticket_reply:

+-----------+-----------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-----------+-----------------+------+-----+---------+----------------+ 
| id  | int(8) unsigned | NO | PRI | NULL | auto_increment | 
| user_id | int(8) unsigned | NO |  | NULL |    | 
| ticket_id | int(8) unsigned | NO | MUL | NULL |    | 
| message | text   | NO |  | NULL |    | 
+-----------+-----------------+------+-----+---------+----------------+ 

Mein Auslöser:

CREATE TRIGGER `ticket_delete` BEFORE DELETE ON ticket 
FOR EACH ROW 
BEGIN 
DELETE FROM ticket_reply 
    WHERE ticket_reply.ticket_id = ticket.id; 
END 

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

Warum?

Danke.

Antwort

1

Entweder Trennzeichen verwenden oder überspringen BEGIN/END:

DELIMITER $ 
CREATE TRIGGER `ticket_delete` BEFORE DELETE ON ticket 
FOR EACH ROW 
BEGIN 
DELETE FROM ticket_reply 
    WHERE ticket_reply.ticket_id = ticket.id; 
END $ 
DELIMITER ; 

oder

CREATE TRIGGER `ticket_delete` BEFORE DELETE ON ticket 
FOR EACH ROW 
DELETE FROM ticket_reply 
    WHERE ticket_reply.ticket_id = ticket.id; 

Es wird die Syntaxfehler weggehen; aber Ihr Auslöser ist falsch, in der Tat sollte es

CREATE TRIGGER `ticket_delete` BEFORE DELETE ON ticket 
FOR EACH ROW 
DELETE FROM ticket_reply 
    WHERE ticket_reply.ticket_id = OLD.id; 

(Hinweis OLD.id statt ticket.id) sein.

+0

Ja in der Tat, es hat nicht funktioniert und jetzt funktioniert es gut mit 'OLD.id'. Es war mein erster Trigger :) Ich dachte, ich würde 'OLD.id' nicht brauchen, weil ich' BEVOR LÖSCHEN EIN' und nicht 'NACH LÖSCHEN EIN' verwende –