Bug #58449 "Before delete" trigger not triggered when deleted by FK
Submitted: 24 Nov 2010 10:18 Modified: 24 Nov 2010 11:03
Reporter: Yajo Man Email Updates:
Status: Not a Bug Impact on me:
None 
Category:MySQL Server: Stored Routines Severity:S2 (Serious)
Version:5.1.49-1ubuntu8.1 OS:Linux
Assigned to: CPU Architecture:Any
Tags: fk, triggers

[24 Nov 2010 10:18] Yajo Man
Description:
When table "A" has a FK set to ON DELETE CASCADE,
and you delete a record,
and this record deletes another record in table "B",
and "B" has a BEFORE DELETE trigger,
B's trigger is not triggered.

How to repeat:
# First create a database for testing
CREATE DATABASE `debug`;
USE `debug`;

# Create table A
CREATE TABLE  `debug`.`A` (
`a_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`a_content` VARCHAR( 100 ) NOT NULL
) ENGINE = INNODB;

# Create table B
CREATE TABLE  `debug`.`B` (
`b_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`a_id` INT NOT NULL ,
`b_content` VARCHAR( 100 ) NOT NULL ,
INDEX (  `a_id` )
) ENGINE = INNODB;

# Add FK to B
ALTER TABLE  `B` ADD FOREIGN KEY (  `a_id` ) REFERENCES  `debug`.`A` (`a_id`)
ON DELETE CASCADE ON UPDATE CASCADE;

# Create BEFORE DELETE trigger on B
DELIMITER $$
CREATE TRIGGER `B_bu` BEFORE DELETE ON `B`
FOR EACH ROW BEGIN
call `Hey, you tried to delete me`();
END $$
DELIMITER ;

# Insert some values in A
INSERT INTO  `A` (`a_content`) VALUES ('first'), ('second');

# Test inserts
SELECT * FROM A;
/* Must show this:

a_id     a_content
------------------
1        first
2        second

*/

# Insert some values in B
INSERT INTO `B` (`b_id`, `a_id`, `b_content`) VALUES (NULL, '1', 'this will be deleted'), (NULL, '2', 'this will not be deleted');

# Test inserts
SELECT * FROM B;
/* Must show this:

b_id     a_id     b_content
---------------------------
1        1        first
2        2        second

*/

# Delete something from A
DELETE FROM A WHERE a_id = 1;
/* Now it should not let you delete, and should send a message saying that
you called a non-existing procedure, and should rollback any changes,
but it just proceeds deleting rows in A and B */

# Check current status of tables
SELECT * FROM A NATURAL JOIN B;
/*
Shows this:

a_id   a_content   b_id   b_content
--------------------------------------------------
2      second      2      this will not be deleted

*/
[24 Nov 2010 11:03] Valeriy Kravchuk
This is documented limitation and, thus, not a bug. Check http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html:

"Note

Currently, cascaded foreign key actions do not activate triggers."