-- Create the tables
(anthony@localhost) [test]> create table foo (a int primary key, b int not null, index(b)) engine=innodb;
Query OK, 0 rows affected (0.33 sec)
create table bar (b int not null, constraint b_exists foreign key (b) references foo(b) on delete cascade) engine=innodb;
Query OK, 0 rows affected (0.40 sec)
Итак, MySQL фактически разрешает эту ситуацию.Weird.Oracle и PostgreSQL не будут (оба порождают ошибки), и я не верю, что стандарт SQL позволяет это (но не проверял, поэтому мог ошибаться там).Давайте посмотрим, как он это обрабатывает:
-- Fill foo
(anthony@localhost) [test]> insert into foo values (1,1);
Query OK, 1 row affected (0.11 sec)
(anthony@localhost) [test]> insert into foo values (2,1);
Query OK, 1 row affected (0.07 sec)
-- Check foreign key works:
(anthony@localhost) [test]> insert into bar values (1);
Query OK, 1 row affected (0.13 sec)
(anthony@localhost) [test]> insert into bar values (2);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`bar`, CONSTRAINT `b_exists` FOREIGN KEY (`b`) REFERENCES `foo` (`b`) ON DELETE CASCADE)
-- Delete
(anthony@localhost) [test]> delete from foo where a = 1;
Query OK, 1 row affected (0.09 sec)
(anthony@localhost) [test]> select * from bar;
Empty set (0.00 sec)
Итак, MySQL удаляет строку из ссылочной таблицы.По крайней мере, в 5.1.49.