Как удалить из нескольких таблиц в 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.

Ответ 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]