触发 ON BEFORE 错误
Trigger ON BEFORE error
我有两个表,想创建一个触发器以在 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 | |
+-------------+-----------------+------+-----+---------+----------------+
和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
为什么?
谢谢。
要么使用定界符,要么跳过 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
)。
我有两个表,想创建一个触发器以在 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 | |
+-------------+-----------------+------+-----+---------+----------------+
和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
为什么?
谢谢。
要么使用定界符,要么跳过 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
)。