Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Одновременное удаление из нескольких таблиц
 
 автор: LO   (07.03.2006 в 12:09)   письмо автору
 
 

Как можно уалить записи из нескольких взаимосвязанных таблиц?
У меня есть таблица (напр., table_u)с первичным ключем u_id. И еще 6 (взаимосвязанных с table_u по u_id) таблиц (table1, table2, ... table6), но у с таблицей table6 связана другая таблица table7 (по индексу), не связанная с table_u.
Вот мне надо удалить одну запись из table_u (зная u_id удаляемой записи), но и все записи из других таблиц, связянные с удаляемой записью.

   
 
 автор: Trianon   (07.03.2006 в 12:38)   письмо автору
 
   для: 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;

   
 
 автор: LO   (07.03.2006 в 12:49)   письмо автору
 
   для: 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

и ничего не удаляется, но и ошибки не выдает

   
 
 автор: Trianon   (07.03.2006 в 12:59)   письмо автору
 
   для: LO   (07.03.2006 в 12:49)
 

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

   
 
 автор: LO   (07.03.2006 в 13:01)   письмо автору
 
   для: Trianon   (07.03.2006 в 12:59)
 

Да, такие варианты возможны
Придется удалять поотдельности :о(
Спасибо, за помошь.

   
 
 автор: cheops   (07.03.2006 в 13:24)   письмо автору
 
   для: 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;

   
 
 автор: Trianon   (07.03.2006 в 13:50)   письмо автору
 
   для: cheops   (07.03.2006 в 13:24)
 

А в 4.0 их можно указывать только в ссылках критерия отбора.
Отсюда вывод: хочешь писать портабельный код - не применяй псевдонимы в DELETE вообще.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования