在错误之前触发ON

时间:2016-12-10 00:13:02

标签: sql triggers mariadb cascading-deletes

我有两个表,并希望在删除故障单时创建一个在ticket_reply上删除的触发器:

票:

PHP_VERSION=$(php -v | tail -r | tail -n 1 | cut -d " " -f 2 | cut -c 1-3)
cd /usr/local/etc/php/$PHP_VERSION/
# cd /usr/local/etc/php/7.1/

并且ticket_reply:

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

我的触发器:

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

为什么呢?

感谢。

1 个答案:

答案 0 :(得分: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)。