Как удалить из нескольких таблиц в MySQL?
Я пытаюсь удалить из нескольких таблиц сразу. Я провел несколько исследований и придумал этот
DELETE FROM `pets` p,
`pets_activities` pa
WHERE p.`order` > :order
AND p.`pet_id` = :pet_id
AND pa.`id` = p.`pet_id`
Однако я получаю эту ошибку
Uncaught Database_Exception [1064]: У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с p, pets_activities
pa...
Я никогда раньше не делал перекрестный стол, поэтому я неопытен и застрял до сих пор!
Что я делаю неправильно?
Ответы
Ответ 1
Используйте JOIN
в инструкции DELETE
.
DELETE p, pa
FROM pets p
JOIN pets_activities pa ON pa.id = p.pet_id
WHERE p.order > :order
AND p.pet_id = :pet_id
В качестве альтернативы вы можете использовать...
DELETE pa
FROM pets_activities pa
JOIN pets p ON pa.id = p.pet_id
WHERE p.order > :order
AND p.pet_id = :pet_id
... для удаления только из pets_activities
См. http://dev.mysql.com/doc/refman/5.0/en/delete.html
Для одиночных удалений таблицы, но с ссылочной целостностью, существуют другие способы выполнения с EXISTS, НЕ СУЩЕСТВУЮТ, IN, NOT IN и т.д. Но выше, где вы указываете, из каких таблиц удалить с помощью псевдонима перед FROM предложение может легко избавить вас от нескольких довольно узких мест. Я имею тенденцию обращаться к EXISTS в 99% случаев, а затем есть 1%, где синтаксис MySQL занимает день.
Ответ 2
Так как это, по-видимому, является простой родительской/дочерней связью между pets
и pets_activities
, вам было бы лучше создать ограничение внешнего ключа с помощью удаления каскада.
Таким образом, когда строка pets
удаляется, связанные с ней строки pets_activities
также автоматически удаляются.
Тогда ваш запрос станет простым:
delete from `pets`
where `order` > :order
and `pet_id` = :pet_id
Ответ 3
Используйте этот
DELETE FROM `articles`, `comments`
USING `articles`,`comments`
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4
или
DELETE `articles`, `comments`
FROM `articles`, `comments`
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4
Ответ 4
У меня нет базы данных mysql для тестирования на данный момент, но попытались ли вы указать, что нужно удалить до предложения from? Например:
DELETE p, pa FROM `pets` p,
`pets_activities` pa
WHERE p.`order` > :order
AND p.`pet_id` = :pet_id
AND pa.`id` = p.`pet_id`
Я думаю, что используемый вами синтаксис ограничивается более новыми версиями mysql.
Ответ 5
Синтаксис выглядит правильно для меня... попробуйте изменить его, чтобы использовать INNER JOIN...
Посмотрите на это: http://www.electrictoolbox.com/article/mysql/cross-table-delete/
Ответ 6
Для всех, кто читает это в 2017 году, я сделал что-то подобное.
DELETE pets, pets_activities FROM pets inner join pets_activities
on pets_activities.id = pets.id WHERE pets.`order` > :order AND
pets.`pet_id` = :pet_id
Как правило, для удаления строк из нескольких таблиц приведен следующий синтаксис. Решение основано на предположении, что между двумя таблицами существует некоторая взаимосвязь.
DELETE table1, table2 FROM table1 inner join table2 on table2.id = table1.id
WHERE [conditions]