|
|
|
| Как можно уалить записи из нескольких взаимосвязанных таблиц?
У меня есть таблица (напр., table_u)с первичным ключем u_id. И еще 6 (взаимосвязанных с table_u по u_id) таблиц (table1, table2, ... table6), но у с таблицей table6 связана другая таблица table7 (по индексу), не связанная с table_u.
Вот мне надо удалить одну запись из table_u (зная u_id удаляемой записи), но и все записи из других таблиц, связянные с удаляемой записью. | |
|
|
|
|
|
|
|
для: LO
(07.03.2006 в 12:09)
| |
DELETE table_u, table1, table2, table3, table4, table5, table6, table7
FROM table_u, table1, table2, table3, table4, table5, table6, table7
WHERE table_6.ref67 = table7.ref67
AND table_u.u_id = $u_id
AND table1.u_id = $u_id
AND table2.u_id = $u_id
AND table3.u_id = $u_id
AND table4.u_id = $u_id
AND table5.u_id = $u_id
AND table6.u_id = $u_id
|
Правда, будут удалены лишь строки, подходящие ко всем таблицам.
Если таблицы неполные, то придется расписывать запросы отдельно
DELETE table7 FROM table6, table7 WHERE table6.u_id = $u_id AND table_6.ref67 = table7.ref67;
DELETE FROM table6 WHERE u_id = $u_id;
DELETE FROM table5 WHERE u_id = $u_id;
DELETE FROM table4 WHERE u_id = $u_id;
DELETE FROM table3 WHERE u_id = $u_id;
DELETE FROM table2 WHERE u_id = $u_id;
DELETE FROM table1 WHERE u_id = $u_id;
DELETE FROM table_u WHERE u_id = $u_id;
|
| |
|
|
|
|
|
|
|
для: Trianon
(07.03.2006 в 12:38)
| | А если я хочу использовать псевдонимы (а то имена таблиц уж очень длинные), где мне их прописывать перед from-ом или после. Я пишу
DELETE t_u, t1, t2, t3, t4, t5, t6, t7
FROM table_u as t_u, table1 as t1, table2 as t2, table3 as t3, table4 as t4, table5 as t5, table6 as t6, table7 as t7
WHERE t6.ref67 = t7.ref67
AND t_u.u_id = $u_id
AND t1.u_id = $u_id
AND t2.u_id = $u_id
AND t3.u_id = $u_id
AND t4.u_id = $u_id
AND t5.u_id = $u_id
AND t6.u_id = $u_id
|
и ничего не удаляется, но и ошибки не выдает | |
|
|
|
|
|
|
|
для: LO
(07.03.2006 в 12:49)
| | Судя по мануалу, псевдонимы Вы ставите правильно.
А не может быть так, что у Вас в базе нет таких u_id, чтобы подходящие записи нашлись сразу во всех семи таблицах? | |
|
|
|
|
|
|
|
для: Trianon
(07.03.2006 в 12:59)
| | Да, такие варианты возможны
Придется удалять поотдельности :о(
Спасибо, за помошь. | |
|
|
|
|
|
|
|
для: Trianon
(07.03.2006 в 12:59)
| | >Судя по мануалу, псевдонимы Вы ставите правильно.
Это от версии MySQL зависит
Использование ключевого слова AS в СУБД MySQL 4.0
mysql> DELETE products, catalogs FROM products AS p, catalogs AS c
-> WHERE p.id_catalog = c.id_catalog;
|
Начиная с версии СУБД MySQL 4.1, псевдонимы требуется использовать по всему оператору DELETE.
Использование ключевого слова AS в СУБД MySQL 4.1
mysql> DELETE p, c FROM products AS p, catalogs AS c
-> WHERE p.id_catalog = c.id_catalog;
|
| |
|
|
|
|
|
|
|
для: cheops
(07.03.2006 в 13:24)
| | А в 4.0 их можно указывать только в ссылках критерия отбора.
Отсюда вывод: хочешь писать портабельный код - не применяй псевдонимы в DELETE вообще. | |
|
|
|