Эта тема на forum.dklab.ru


Педагог: Удаление связанных записей в MySql
Есть две связанные таблицы A и B следующей структуры:

А.id
A.name

B.id
B.a_id
B.child

связь один ко многим A.id=B.a_id

Как сделать так, чтобы при удалении записи в таблице A (например "DELETE from A where name='vasya'") автоматически удалялись связанные записи таблицы Б.
Юрий Насретдинов:
Педагог:

select id from A where name='vasya'

DELETE from A where name='vasya'

DELETE from B where id IN(...)


где вместо ... подставляются данные первого запроса.

P.S. Если это MySQL 4, то таких извращений естественно делать не нужно - связанные данные сами удалятся.
Graymur: Re: Удаление связанных записей в MySql
http://dev.mysql.com/doc/mysql/en/DELETE.html
Multiple-table syntax:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
tbl_name[.*] [, tbl_name[.*] ...]
FROM table_references
[WHERE where_definition]

Or:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM tbl_name[.*] [, tbl_name[.*] ...]
USING table_references
[WHERE where_definition]

Юрий Насретдинов:

From MySQL 4.0, you can specify multiple tables in the DELETE statement to delete rows from one or more tables depending on a particular condition in multiple tables. However, you cannot use ORDER BY or LIMIT in a multiple-table DELETE.


Насколько я понимаю, человеку не нужен MySQL 4, потому что там и не нужно использовать этот синтаксис - нужные записи удаляются сами
Педагог:
2yUAC
Ну ваше решения и ежикам (надеюсь :) известно.

2Graymur
Спасибо. Теперь осталось у хостера узнать версию MySql и уточнить правильность запроса по выше приведенному примеру:

DELETE A FROM A, B WHERE A.name='vasya' AND A.id=B.a_id

Правильно?
Педагог:
Да, но все же. Мне ораклисты рассказывали вкратце, что у них при создании таблиц указывается жесткая связь один-ко-многим, которая сохраняет целостность данных, то есть при простом удалении записи (delete from A where ...) в табл А, связанные записи из таблицы B удаляются автоматически. Есть ли такое в MySql?
Дмитрий Котеров:
Есть. Кажется, в InnoDB-таблицах (сожет, даже в BDB есть), и - по-моему, в четвертой версии только (хотя может InnoDB поддерживает каскадное удаление и в третьей, надо смотреть документацию).
Graymur:
Есть. Кажется, в InnoDB-таблицах (сожет, даже в BDB есть), и - по-моему, в четвертой версии только (хотя может InnoDB поддерживает каскадное удаление и в третьей, надо смотреть документацию).
В InnoDB каскадное удаление есть, с версии 4.0.0 точно. В BDB вроде нет.

Эта тема на forum.dklab.ru