Как использовать каскад удаления на движке хранения MySQL MyISAM? - PullRequest
8 голосов
/ 17 марта 2011

У меня есть одна таблица, которую я назвал equipment , и 8 других таблиц, которые я назвал equipment_child1 и т. Д. До equipment_child8 .

Поле commom между всеми этими таблицами: cod_equip , с этим полем я могу идентифицировать все мои дочерние устройства таблицы с equipment родительской таблицей.

Мне нужно удалить данные из оборудования , когда оборудование перемещено, но мне нужно удалить данные из всех моих таблиц equipment_child1 в equipment_child8.

тогда я вспомнил, что использовал DELETE CASCADE в движке innoDB, но теперь я использую движок MyISAM, это проблема?

Любая помощь, действительно уточнит ...

1 Ответ

14 голосов
/ 17 марта 2011

Да.Просто вы не можете с этим двигателем.

редактировать.Вы можете написать триггер, который после удаления записи в вашей таблице удалит все дочерние записи во всех других таблицах.

Хорошо.Я написал вам пример:

 create table tab1 (
 id int )
 engine = myisam;

insert into tab1 values (1),(2),(3),(4); 

 create table tab2(
 id int not null auto_increment primary key,
 id_tab1 int
 ) engine = myisam;

 insert into tab2 (id_tab1) values (1),(2),(2),(3),(4);

 create table tab3(
 id int not null auto_increment primary key,
 id_tab1 int
 ) engine = myisam;

  insert into tab3 (id_tab1) values (1),(2),(2),(3),(2);


delimiter //
create trigger deletecascade after delete on tab1
for each row
begin
delete from tab2 where id_tab1 = old.id;
delete from tab3 where id_tab1 = old.id;
end; //
delimiter ;

delete from tab1 where id = 2;

Надеюсь, что это поможет.

edit.Очевидно, что это работает, даже если вы одновременно удалите больше идентификатора из таблицы:

delete from tab1 where id in (2,3,4);
...