Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Необходимо удалить раздел если он пустой 
V
    Опции темы
maxipub
Дата 26.11.2014, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Всем добрый день!

Есть таблица с разделами (table5 smile ), в разделах может быть контент (table6 smile ). При запросе на удаление раздела последний необходимо удалять только если в нем нет контента. Раньше я делал SELECT контента по id раздела, если нечего в разделе нет, сразу же делал DELETE раздела (2 отдельных запроса). Но там достаточно высокая параллельная активность. Понимаю, вероятность что между SELECT и DELETE вклинится какой-нибудь INSERT контента в удаляемых раздел практически нулевая. Но все равно мне такой подход кажется кривым.

Вот подумал, а нельзя ли одним запросом сделать? начал экспериментировать, пришел вот к чему:

Код
DELETE t5 FROM table5 t5 LEFT JOIN table6 t6 ON t6.id=t5.id WHERE t5.id=1 AND t6.id IS NULL


Раньше так никогда не делал. Вроде работает правильно. Хотелось бы уточнить у профи, насколько такой запрос корректный?

ЗЫ: используется MyISAM, в МАНе пишут что таблица блокируется при записи в нее; именно про DELETE ничего не видел, но по логике удаление - это тоже запись? Таблица при таком запросе будет блокироваться сразу, или только после JOIN? Просто чтоб не оказалось что "проблему" вклинивания такой подход тоже не ликвидировал... smile 

Это сообщение отредактировал(а) maxipub - 26.11.2014, 11:58
PM MAIL   Вверх
maxipub
Дата 26.11.2014, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Эгегей! smile 
PM MAIL   Вверх
baldina
Дата 26.11.2014, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



Цитата(maxipub @  26.11.2014,  18:34 Найти цитируемый пост)
Эгегей!

простите, сенсей, мы сбежались и щас все решим.

Цитата(maxipub @  26.11.2014,  11:57 Найти цитируемый пост)
Раньше я делал SELECT контента по id раздела, если нечего в разделе нет, сразу же делал DELETE раздела (2 отдельных запроса). Но там достаточно высокая параллельная активность.

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

Цитата(maxipub @  26.11.2014,  11:57 Найти цитируемый пост)
Таблица при таком запросе будет блокироваться сразу, или только после JOIN?

запрос исполняется как единое целое

Цитата(maxipub @  26.11.2014,  11:57 Найти цитируемый пост)
насколько такой запрос корректный?

выглядит нормально, если они действительно по id связаны
можно и что-то вроде
Код

delete from table5 where id=1 and (select count(*) from table6 where id=t1.id)=0


PM MAIL   Вверх
maxipub
Дата 27.11.2014, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Цитата(baldina @  26.11.2014,  19:38 Найти цитируемый пост)
простите, сенсей, мы сбежались и щас все решим.

Ну наконец-то! smile 

Цитата(baldina @  26.11.2014,  19:38 Найти цитируемый пост)
выглядит нормально, если они действительно по id связаны

Да, связаны.

Цитата(baldina @  26.11.2014,  19:38 Найти цитируемый пост)
можно и что-то вроде

Прикольно. smile 

Спасибо за консультации! smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.