2016-12-10 2 views
0

У меня есть две таблицы, и хотел бы создать триггер для удаления на ticket_reply, когда билет будет удален:Trigger ON ДО ошибки

билет:

+-------------+-----------------+------+-----+---------+----------------+ 
| 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 |    | 
+-------------+-----------------+------+-----+---------+----------------+ 

И 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 |    | 
+-----------+-----------------+------+-----+---------+----------------+ 

Кузов:

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

Я получаю сообщение об ошибке: #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

Почему?

Спасибо.

ответ

1

Либо использовать разделители, или пропустить 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 ; 

или

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

Это сделает синтаксическую ошибку уйти; но триггер не так, на самом деле это должно быть

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

(уведомление OLD.id вместо ticket.id).

+0

Да, действительно, он не работал, и теперь он отлично работает с «OLD.id». Это был мой первый триггер :) Я думал, что мне не понадобится «OLD.id», потому что я использую «ПРЕЖДЕ ЧЕМ УДАЛИТЬ», а не «ПОСЛЕ УДАЛЕНИЯ ВКЛ», –