[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: удалить из пяти таблиц сразу.
dima4321
Всем привет )

Имею кучу контента в своей базе.

Хочу несколько десятков пунктов удалить.

Данный скрипт получает переменную GET.
PHP:
<?php

ini_set('display_errors',1);
error_reporting(E_ALL);

header('Location: index.php');

include "yzel.php";

$id = $_GET['id'];

$sql = "DELETE FROM names WHERE id = '$id'";



if(mysql_query($sql))

{
echo "$page удалена";


}

else
{
echo 'Не удалось удалить';
}
?>






это пример с одной таблицей.


но у меня также с этим id есть таблицы history tracklist keywords и keys


т.е. есть связка.

Код:
FROM `names`  INNER JOIN `tracklist` ON `name_id` = `names`.`id`





Код:
FROM `names`  INNER JOIN `history` ON `name_id` = `names`.`id`





Код:
FROM `names`  INNER JOIN `keywords` ON `name_id` = `names`.`id`





Код:
FROM `names`  INNER JOIN `keywords` ON `name_id` = `names`.`id`





как мне составить запрос так, чтобы все махом удалить из всех 5 таблиц.

Примечание:

таблицы history , tracklist и т.д. имеют в своем арсенале одинаковые id

т.е. напрмер id 163 в таблице names идет один раз. , а в таблице tracklist 9 раз

Заранее спасибо.



Спустя 1 час, 4 минуты, 40 секунд (11.04.2011 - 09:41) T1grOK написал(а):
DELETE FROM table1, table2, table3 WHERE name_id = '$id'"

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

Спустя 27 минут, 9 секунд (11.04.2011 - 10:08) Trianon написал(а):
T1grOK

У Вас такое работало?
По-моему будет ambigous column name_id

да и само по себе table1, table2, table3 смахивает на CROSS JOIN ,
так что если эта конструкция и вправду исполнится - все три таблицы вообще окажутся пустыми.

Спустя 5 минут, 6 секунд (11.04.2011 - 10:13) Trianon написал(а):
dima4321
DELETE `names`, `history`, `keywords`, `tracklist` 
FROM `names`
LEFT JOIN `history` ON `history`.name_id = `names`.id
LEFT JOIN `keywords` ON `keywords`.name_id = `names`.id
LEFT JOIN `tracklist` ON `tracklist`.name_id = `names`.id
WHERE `names`.id = $id


Впрочем, эффективность такого запроса остается на Вашей совести.

Спустя 22 минуты, 17 секунд (11.04.2011 - 10:35) sergeiss написал(а):
Цитата (dima4321 @ 11.04.2011 - 09:36)

это пример с одной таблицей.

но у меня также с этим id есть таблицы history tracklist keywords и keys

А какая главная таблица - names?

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

Спустя 1 час, 2 минуты, 21 секунда (11.04.2011 - 11:37) dima4321 написал(а):
Trianon
sergeiss
спасибо за рассуждения


давайте я покажу как я это сделал очень длинно, а вы подскажите как сделать это покороче

<?php

ini_set('display_errors',1);
error_reporting(E_ALL);

//header('Location: index.php');

include "yzel.php";

$id = $_GET['id'];

$sql = "DELETE FROM names WHERE id = '$id'";

if(mysql_query($sql))

{
echo "id удален<br>";
}
else
{
echo 'Не удалось удалить<br>';
}

$sql1 = "DELETE FROM tracklist WHERE name_id = '$id'";

if(mysql_query($sql1))

{
echo "альбомы удалены<br>";
}
else
{
echo 'Не удалось удалить<br>';
}

$sql2 = "DELETE FROM history WHERE name_id = '$id'";

if(mysql_query($sql2))

{
echo "история удалена<br>";
}
else
{
echo 'Не удалось удалить<br>';
}

$sql3 = "DELETE FROM keys WHERE name_id = '$id'";

if(mysql_query($sql3))

{
echo "ключи удалены<br>";
}
else
{
echo 'Не удалось удалить<br>';
}


$sql4 = "DELETE FROM keywords WHERE name_id = '$id'";

if(mysql_query($sql4))

{
echo "ключи исторрий удалены<br>";
}
else
{
echo 'Не удалось удалить<br>';
}




?>

Спустя 36 минут, 41 секунда (11.04.2011 - 12:14) sergeiss написал(а):
Это неправильно по той причине, что тут нету анализа корректности удаления.

Если в одной из таблиц данные не будут удалены по любой причине, то они останутся. Будут висеть ненужным "хвостом".

Если же ты будешь использовать триггер, то там это всё можно учесть.

Другой вариант, кстати говоря, это не триггер, а функция в MySQL. Которой передаешь нужный id и там уже всё, что нужно, удаляется из нужных таблиц. При этом ты можешь сделать контроль целостности. А вызывать будешь только эту функцию.

Спустя 1 час, 36 минут, 34 секунды (11.04.2011 - 13:51) Krevedko написал(а):
где можно про триггеры почитать, чтобы понятно и доходчиво ? smile.gif

Спустя 11 минут, 31 секунда (11.04.2011 - 14:02) sergeiss написал(а):
Да в хэлпе достаточно доходчиво, вобщем-то. Скачиваешь хэлп с официального сайта и изучаешь.

Спустя 7 минут, 44 секунды (11.04.2011 - 14:10) Krevedko написал(а):
адрес официального сайта в студию )

Спустя 30 минут, 31 секунда (11.04.2011 - 14:40) Trianon написал(а):
dev.mysql.com/doc

Спустя 16 минут, 42 секунды (11.04.2011 - 14:57) Krevedko написал(а):
русских как всегда обделили

Спустя 1 час, 22 минуты, 23 секунды (11.04.2011 - 16:20) Trianon написал(а):
я так думаю, русские сами себя обделили.
Захотел бы кто перевести - перевел бы. Собственно, с версией 4.0 так и было.

Спустя 1 час, 33 минуты, 37 секунд (11.04.2011 - 17:53) inpost написал(а):
Trianon
А через OR работать не будет? :
DELETE FROM table1, table2, table3 WHERE table1.name_id = '$id'" OR table2.name_id = $id и т.д. ?

Спустя 4 часа, 1 минута, 33 секунды (11.04.2011 - 21:55) sergeiss написал(а):
Цитата (Krevedko @ 11.04.2011 - 15:57)

русских как всегда обделили

Цитата (Trianon @ 11.04.2011 - 17:20)
я так думаю, русские сами себя обделили.

А кто мешает зайти на http://mysql.ru/ и почитать там???

Плюс к этому, те из русских, кто хочет быть в курсе последних новостей и разработок, учатся читать по-английски. Чтобы не сидеть и не ждать, пока "добрый дядя" переведет. Причем, качество перевода на русский никто не гарантирует!!!

Спустя 14 минут, 53 секунды (11.04.2011 - 22:10) Trianon написал(а):
sergeiss
Цитата
Цитата
Цитата (Trianon @ 11.04.2011 - 17:20)
я так думаю, русские сами себя обделили.

А кто мешает зайти на http://mysql.ru/ и почитать там???

А вторую строку прочитать?
на mysql.ru справочное руководство как раз и ораничивается версией 4.0.
Переведено оно, кстати, достаточно аккуратно.

Спустя 4 минуты, 52 секунды (11.04.2011 - 22:14) sergeiss написал(а):
Trianon - по-моему, ключевыми словами у меня было вот это:
Цитата (sergeiss @ 11.04.2011 - 22:55)
те из русских, кто хочет быть в курсе последних новостей и разработок, учатся читать по-английски.

потому что
Цитата (sergeiss @ 11.04.2011 - 22:55)
Чтобы не сидеть и не ждать, пока "добрый дядя" переведет.

Иначе сами себя и ограничиваем. "Под лежачий камено вода не течет" (с) - народная мудрость.

И вообще... Минимум процентов 90 тем на форуме появляются из-за того, что люди не хотят или не умеют читать документацию "в оригинале" (по-английски). Будь это ПХП, Мускуль, CSS или HTML.


_____________
Работаю за еду ! __))
И за плюсики !
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.