Search code examples
sqltriggersmariadbcascading-deletes

Trigger ON BEFORE error


I have two tables and would like to create a trigger to delete on ticket_reply when a ticket is deleted:

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

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

My trigger:

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

I get the error message: #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

Why?

Thanks.


Solution

  • Either use delimiters, or skip 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 ;
    

    or

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

    It will make the syntax error go away; but your trigger is wrong, in fact it should be

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

    (notice OLD.id instead of ticket.id).