2016-10-24 3 views
0

Вариант использования довольно прямолинейный. После просмотра таблицы комментариев из нескольких миллионов строк. Мы понимаем, что есть много детей-сирот.Удаление сирот в самоподготовке

Следующий запрос не работает

DELETE c.* FROM `comment` c 
where c.parentId not in (select id from `comment`) 

Это говорит что-то вроде:

3 были обнаружены ошибки в процессе анализа:

статического анализа.

Неожиданный токен. (около «c» в позиции 7) Неожиданный токен. (около «.» в позиции 8) Неожиданный токен. (Рядом с «*» в положении 9)

MySQL говорит: Документация

1093 - Вы не можете указать целевую таблицу «с» для обновления в ЕКОМ

Я понимаю эту проблему, но не может подумайте об альтернативе. Я очень плохо SQL

+0

Независимо от того, что вы делаете, проверьте эти теории для глобальных обновлений и удалите их на таблицах-заглушки – Drew

ответ

1

Вы должны использовать left join для этой операции:

DELETE c 
    FROM comment c LEFT JOIN 
     comment cp 
     ON c.parentId = cp.id 
    WHERE cp.id IS NULL and c.parentId is not null; 

ли примечание: Я думаю, вы должны быть осторожны. У всех комментариев действительно есть родитель, который является комментарием?

+0

спасибо, позвольте мне попробовать. Я буду осторожен –

+0

Кажется, не совсем правильно. Я заменяю DELETE на SELECT, и он дал слишком много (неправильных) записей –

+0

@PhamHuyAnh. , , Я подозреваю, что проблема в том, что 'c.parentId' не должен быть' NULL'. –